2015-09-23 21 views
7

Tôi đã có một TypeScript/Angular 2 Observable hoạt động hoàn hảo trong lần đầu tiên tôi gọi nó. Tuy nhiên, tôi quan tâm đến việc gắn nhiều người đăng ký với cùng một người quan sát và bằng cách nào đó làm mới những người có thể quan sát được và những người đăng ký đính kèm. Dưới đây là những gì tôi đã có:Làm thế nào để khởi động lại hoặc làm mới một Observable?

query(): Rx.Observable<any> { 

return this.server.get('http://localhost/rawData.json').toRx().concatMap(
    result => 
     result.json().posts 
    ) 
    .map((post: any) => { 
     var refinedPost = new RefinedPost(); 
     refinedPost.Message = post.Message.toLowerCase(); 

     return refinedPost; 

    }).toArray(); 

} 

Hình ảnh có nút quan sát được khi được nhấn, thực hiện lại điều này và mọi người đăng ký được kết nối với nó sẽ nhận được tập dữ liệu cập nhật.

Tôi làm cách nào để thực hiện việc này?

Trả lời

4

Tôi không biết quá nhiều về Angular2 và nguyên cảo, nhưng nguyên cảo là một superset của javascript, tôi đã giả thuyết sau đây (cho tôi biết nếu tôi sai) nên sẽ khiến cho công việc mã javascript sau:

  • server.get trả về một lời hứa (hoặc mảng hoặc Rx.Observable)
  • posts là một mảng của post

Bạn sẽ cần phải tạo một thể quan sát được từ sự kiện nhấp chuột vào đó nút, bản đồ nhấp vào yêu cầu GET của bạn và phần còn lại sẽ ít nhiều như bạn đã viết. Tôi không thể kiểm tra nó, nhưng nó phải đi dọc theo những đường:

// get the DOM id for the button 
var button = document.getElementById('#xxx'); 

// create the observable of refined posts 
var query$ = 
    Rx.Observable.fromEvent(button, 'click') 
     .flapMapLatest(function (ev) { 
        return this.server.get('http://localhost/rawData.json') 
        }) 
     .map(function (result){return result.json().posts}) 
     .map(function (posts) { 
       return posts.map(function(post){ 
            var refinedPost = new RefinedPost(); 
            refinedPost.Message = post.Message.toLowerCase(); 
            return refinedPost; 
          }) 
      }) 
     .share() 

// subscribe to the query$. Its output is an array of refinedPost 
// All subscriptions will see the same data (hot source) 
var subscriber = query$.subscribe(function(refinedPosts){console.log(refinedPosts)}) 

Một số giải thích:

  1. Mỗi nhấp chuột sẽ tạo ra một cuộc gọi đến server.get mà trả về một kiểu quan sát được tương thích (mảng, lời hứa, hoặc có thể quan sát được). Việc quay trở lại quan sát được làm phẳng để trích xuất result từ đó gọi
  2. Vì người dùng có thể nhấp nhiều lần và mỗi lần nhấp tạo luồng dữ liệu và chúng tôi quan tâm (giả thuyết khác tôi cũng làm ở đây) chỉ trong kết quả mới nhất nhấp vào, chúng tôi sử dụng toán tử flatMapLatest, sẽ chỉ thực hiện flatMap trên quan sát được tạo bởi lần nhấp mới nhất
  3. Chúng tôi trích xuất mảng bài đăng posts và tạo một mảng refinedPost từ đó. Cuối cùng, mỗi nhấp chuột sẽ tạo ra một mảng refinedPost mà tôi giả định là những gì bạn muốn
  4. Chúng tôi chia sẻ điều này khi bạn đề cập đến bạn sẽ có nhiều người đăng ký và bạn muốn tất cả người đăng ký thấy cùng một dữ liệu.

Hãy cho tôi biết nếu giả thuyết của tôi là chính xác và nếu điều này phù hợp với bạn.

Bên cạnh đó tôi khuyên bạn nên có một cái nhìn tại https://gist.github.com/staltz/868e7e9bc2a7b8c1f754

Ngoài việc là một lời nhắc nhở rất tốt của các khái niệm, nó đề cập đến một vấn đề refresh cuộc gọi máy chủ rất giống như của bạn.

+0

Cảm ơn câu trả lời. Nó tốt, nhưng nó làm cho một giả định rằng tôi không chắc chắn về: rằng tôi đang trực tiếp chụp nút bấm. Trong thực tế, trình xử lý nhấn nút nằm trong một lớp khác với công việc quan sát được. Tôi muốn có thể khởi động một bản cập nhật của quan sát chỉ với một cuộc gọi hàm. FWIW, tôi đã có thể làm những gì tôi muốn với một Chủ đề, nhưng tôi tự hỏi nếu có cách nào để làm điều đó với "thẳng" – kenstone

+0

Có bạn có thể thay thế 'Rx.Observable.fromEvent (button,' click ') ' theo chủ đề của bạn. Đôi khi bạn có thể sử dụng 'Rx.Observable.create' thay cho một chủ đề, bao bọc việc tạo người nghe bên trong nó, và trả về một lần để loại bỏ người nghe - nhưng không nhìn thấy mã của bạn tôi không biết nếu nó có thể hay không. Vui mừng nó làm việc mặc dù. Không có gì sai khi sử dụng một chủ đề khi không có tùy chọn tốt hơn có sẵn ví dụ khi bạn không/không thể có nguồn sự kiện trong phạm vi. BTW, một số hướng dẫn SO: nếu câu trả lời là tốt cho bạn, bạn nên chấp nhận nó. – user3743222

Các vấn đề liên quan