Ось ще один, але я почуваюся більш прямолінійним та інтуїтивним (або, принаймні, природним, якщо ви звикли до обіцянок), підхід. В основному, ви створюєте 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
Готово!