Ось ще один, але я почуваюся більш прямолінійним та інтуїтивним (або, принаймні, природним, якщо ви звикли до обіцянок), підхід. В основному, ви створюєте Observable за допомогою Observable.create()
обгортання one
та two
як єдиний Observable. Це дуже схоже на те, як Promise.all()
може працювати.
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();
}
);
}
);
});
Отже, що тут відбувається? Спочатку ми створюємо новий Observable. Функція, передана Observable.create()
, з доречним іменем onSubscription
, передається спостерігачеві (побудована з параметрів, до яких ви переходите subscribe()
), яка схожа на resolve
таreject
об'єднується в єдиний об'єкт під час створення нового Promise. Ось так ми змушуємо магію працювати.
У Росії onSubscription
ми підписуємось на перший Observable (у наведеному вище прикладі це називалося one
). Як ми поводимось next
і error
залежить від вас, але за замовчуванням, наведеному в моєму зразку, слід відповідати загалом. Однак, коли ми отримуємо complete
подію, це означаєone
, що тепер зроблено, ми можемо підписатися на наступний Observable; тим самим вистрілює другий Observable після завершення першого.
Приклад спостерігача, наданий для другого спостережуваного, досить простий. В основному, second
зараз діє як те, що ви очікували two
би діяти як в ОП. Більш конкретно, second
буде випромінюватися перше і єдине перше значення, випущене параметром someOtherObservable
(черезtake(1)
), а потім завершене, припускаючи, що помилки немає.
Приклад
Ось повний робочий приклад, який ви можете скопіювати / вставити, якщо хочете побачити, як мій приклад працює в реальному житті:
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!");
}
);
Якщо ви дивитесь консоль, надрукується наведений вище приклад:
1
6
Готово!