Đây là một cách khác, nhưng tôi cảm thấy đơn giản và trực quan hơn (hoặc ít nhất là tự nhiên nếu bạn đã quen với Lời hứa), hãy tiếp cận. Về cơ bản, bạn tạo một Observable bằng cách sử dụng Observable.create()
để bọc one
và two
như một Observable duy nhất. Điều này rất giống với cách Promise.all()
có thể hoạt động.
var first = someObservable.take(1);
var second = Observable.create((observer) => {
return first.subscribe(
function onNext(value) {
},
function onError(error) {
observer.error(error);
},
function onComplete() {
someOtherObservable.take(1).subscribe(
function onNext(value) {
observer.next(value);
},
function onError(error) {
observer.error(error);
},
function onComplete() {
observer.complete();
}
);
}
);
});
Vậy, chuyện gì đang xảy ra ở đây? Đầu tiên, chúng tôi tạo một Observable mới. Hàm được truyền đến Observable.create()
, được đặt tên phù hợp onSubscription
, được chuyển cho trình quan sát (được xây dựng từ các tham số bạn truyền vào subscribe()
), tương tự resolve
và được reject
kết hợp thành một đối tượng duy nhất khi tạo một Lời hứa mới. Đây là cách chúng tôi làm cho điều kỳ diệu hoạt động.
Trong onSubscription
, chúng tôi đăng ký vào Observable đầu tiên (trong ví dụ trên, điều này được gọi là one
). Cách chúng tôi xử lý next
và error
tùy thuộc vào bạn, nhưng nói chung, mặc định được cung cấp trong mẫu của tôi phải phù hợp. Tuy nhiên, khi chúng tôi nhận được complete
sự kiện, nghĩa one
là bây giờ đã hoàn tất, chúng tôi có thể đăng ký có thể quan sát tiếp theo; do đó kích hoạt Observable thứ hai sau khi thứ nhất hoàn thành.
Trình quan sát mẫu được cung cấp cho Trình quan sát thứ hai khá đơn giản. Về cơ bản, second
bây giờ hoạt động giống như những gì bạn mong đợi two
để hoạt động như trong OP. Cụ thể hơn, second
sẽ phát ra giá trị đầu tiên và duy nhất được phát ra bởi someOtherObservable
(because of take(1)
) và sau đó hoàn thành, giả sử không có lỗi.
Thí dụ
Đây là một ví dụ đầy đủ, hoạt động, bạn có thể sao chép / dán nếu bạn muốn xem ví dụ của tôi hoạt động trong đời thực:
var someObservable = Observable.from([1, 2, 3, 4, 5]);
var someOtherObservable = Observable.from([6, 7, 8, 9]);
var first = someObservable.take(1);
var second = Observable.create((observer) => {
return first.subscribe(
function onNext(value) {
observer.next(value);
},
function onError(error) {
observer.error(error);
},
function onComplete() {
someOtherObservable.take(1).subscribe(
function onNext(value) {
observer.next(value);
},
function onError(error) {
observer.error(error);
},
function onComplete() {
observer.complete();
}
);
}
);
}).subscribe(
function onNext(value) {
console.log(value);
},
function onError(error) {
console.error(error);
},
function onComplete() {
console.log("Done!");
}
);
Nếu bạn xem bảng điều khiển, ví dụ trên sẽ in:
1
6
Làm xong!