2017-04-11 16 views
8

Tôi đang chuyển từ thế giới Promise sang thế giới quan sát được. Một điều tôi thường làm với Promise là chuỗi một loạt các nhiệm vụ và làm cho chúng chạy theo thứ tự. Ví dụ: tôi có ba tác vụ: printLog1() để in 1 vào bảng điều khiển, printLog23() để in 2 và 3 vào bảng điều khiển và printLog4() để in 4.Làm thế nào để buộc các quan sát thực thi theo trình tự?

Khi tôi muốn in 1-2-3-4, tôi sẽ viết một chuỗi lời hứa như

printLog1() 
    .then(() => { 
    printLog23(); 
    }) 
    .then(() => { 
    printLog4(); 
    }); 

Bây giờ tôi muốn các chức năng tương tự với Quan sát và tôi có thể viết lại printLog() chức năng thành một Quan sát như

printLog1 = Rx.Observabale.of(1).map((i) => console.log(i)); 
printLog23 = Rx.Observabale.of(2, 3).map((i) => console.log(i)); 
printLog4 = Rx.Observabale.of(4).map((i) => console.log(i)); 

Sau đó, tôi có ba quan sát mà phát ra va khác nhau lues đến bàn điều khiển. Làm thế nào để tôi chuỗi chúng để ba quan sát này có thể chạy theo thứ tự và in 1-2-3-4?

Trả lời

11

Nếu bạn muốn chắc chắn thứ tự phát thải giống như thứ tự mà bạn đã chỉ định nguồn quan sát, bạn có thể sử dụng các toán tử concat hoặc concatMap.

Các nhà khai thác concat* đăng ký một Chỉ có thể quan sát sau khi hoàn thành có thể quan sát trước đó (nó cũng hoạt động với lời hứa, xem http://reactivex.io/rxjs/class/es6/MiscJSDoc.js~ObservableInputDoc.html).

Trong trường hợp nó bạn sẽ trông giống như sau:

Observable.concat(printLog1, printLog23, printLog4); 

... hoặc với concatMap nếu yêu cầu cho một Promise phụ thuộc vào phản hồi từ Promise trước:

printLog1 
    .concatMap(response => ...) 
    .concatMap(response => ...); 

... hoặc khi đơn đặt hàng không quan trọng, bạn có thể sử dụng merge để đăng ký ngay tất cả các Quan sát/Hứa hẹn và trả lại kết quả khi chúng đến:

Observable.merge(printLog1, printLog23, printLog4); 
+0

Cảm ơn bạn đã nhắc tôi về các nhà điều hành concat. –

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