2016-02-24 18 views
39

Trong Angular 1.x đôi khi tôi cần phải thực hiện nhiều yêu cầu http và làm điều gì đó với tất cả các phản hồi. Tôi sẽ ném tất cả các lời hứa trong một mảng và gọi Promise.all(promises).then(function (results) {...}).Hành vi Promise.all với RxJS Observables?

Thực tiễn tốt nhất về góc 2 dường như chỉ hướng tới việc sử dụng sốcủa RxJS làm thay thế cho lời hứa trong yêu cầu http. Nếu tôi có hai hoặc nhiều Đài quan sát khác nhau được tạo từ yêu cầu http, chúng có tương đương với Promise.all() không?

Trả lời

37

Cách khác đơn giản hơn để bắt chước Promise.all là sử dụng các nhà điều hành forkJoin (nó bắt đầu tất cả các quan sát song song và tham gia các yếu tố cuối cùng của họ):

Một chút ngoài phạm vi, nhưng trong trường hợp có lời hứa chuỗi, bạn có thể sử dụng đơn giản flatMap: Cf. RxJS Promise Composition (passing data)

+1

nếu tôi có 2 cuộc gọi một sự trở lại hứa hẹn và một sự trở lại quan sát được tôi có thể sử dụng forkjoin? hoặc promise.all()? hoặc không có ai, tôi phải để cho 2 hàm trả về cùng một loại hoặc là lời hứa hoặc có thể quan sát được? –

3

forkTính năng cũng hoạt động tốt, nhưng tôi thích combineLatest vì bạn không cần phải lo lắng về việc sử dụng giá trị cuối cùng của các quan sát được. Bằng cách này, bạn chỉ có thể được cập nhật bất cứ khi nào có bất kỳ giá trị nào trong số đó phát ra một giá trị mới (ví dụ: bạn tìm nạp một khoảng thời gian hoặc một thứ gì đó).

+0

Điều này không đáp ứng được các nhu cầu hiện tại của tôi nhưng tôi chắc chắn sẽ sớm sử dụng nó. –

+1

Điều đó không đạt được hành vi tương tự như Promise.all(), nhưng nó tương tự như Promise.any() – Purrell

+0

nếu tôi có 2 cuộc gọi trở lại một lời hứa và một trở lại quan sát tôi có thể sử dụng forkjoin? hoặc promise.all()? hoặc không có ai, tôi phải để cho 2 hàm trả về cùng một loại hoặc là lời hứa hoặc có thể quan sát được? –

2

On reactivex.ioforkJoin thực sự chỉ đến Zip, mà đã làm công việc cho tôi:

let subscription = Observable.zip(obs1, obs2, ...).subscribe(...); 
Các vấn đề liên quan