2015-12-09 17 views
31

Tôi muốn có thể chờ đợi trên một quan sát, ví dụ:Làm thế nào tôi có thể 'chờ đợi' trên một Rx Observable?

const source = Rx.Observable.create(/* ... */) 
//... 
await source; 

Một kết quả nỗ lực ngây thơ trong chờ đợi giải quyết ngay lập tức và không gây cản trở thi công

Edit: Các giả đủ usecase dự định của tôi là:

if (condition) { 
    await observable; 
} 
// a bunch of other code 

Tôi hiểu rằng tôi có thể di chuyển mã khác vào một hàm riêng biệt khác và chuyển nó vào cuộc gọi lại đăng ký, nhưng tôi hy vọng có thể tránh được điều đó.

+0

Bạn không thể di chuyển mã còn lại (mà bạn muốn đợi mã nguồn) vào một cuộc gọi phương thức '.subscribe()'? – StriplingWarrior

Trả lời

39

Bạn phải chuyển lời hứa đến await. Chuyển đổi sự kiện tiếp theo có thể quan sát thành lời hứa và chờ đợi điều đó.

if (condition) { 
    await observable.first().toPromise(); 
} 

Sửa lưu ý: Câu trả lời này ban đầu được sử dụng .take (1) nhưng đã được thay đổi để sử dụng .first() mà tránh được vấn đề của Promise không bao giờ giải quyết nếu dòng kết thúc trước khi một giá trị đi qua.

+2

Thay vì lấy (1) bạn có thể sử dụng 'await observable.first(). ToPromise();'? – apricity

+0

@apricity Điều đó sẽ xuất hiện giống nhau. – AgentME

+8

@apricity Nếu không có giá trị khi hoàn thành, 'first()' sẽ dẫn đến từ chối và 'take (1)' sẽ dẫn đến lời hứa đang chờ xử lý. – estus

5

Bạn cần phải await lời hứa, vì vậy bạn sẽ muốn sử dụng toPromise(). Xem this để biết thêm chi tiết về toPromise().

9

Nó phải được

await observable.first().toPromise(); 

Vì nó đã được ghi nhận trong ý kiến ​​trước đây, có sự khác biệt đáng kể giữa take(1)first() nhà khai thác khi có sản phẩm nào hoàn thành quan sát được.

Observable.empty().first().toPromise() sẽ dẫn đến từ chối với EmptyError có thể được xử lý phù hợp, thường là hành vi mong muốn.

Observable.empty().take(1).toPromise() sẽ dẫn đến lời hứa đang chờ xử lý, điều mong muốn ... hầu như không bao giờ xảy ra.

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