Вот еще один, но мне кажется более простым и интуитивно понятным (или, по крайней мере, естественным, если вы привыкли к обещаниям) подход. По сути, вы создаете 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объединен в один объект при создании нового обещания. Вот как мы заставляем волшебство работать.
В onSubscription, мы подписываемся на первый Observable (в приведенном выше примере он был вызван one). Как мы будем поступать, nextи решать errorвам, но значение по умолчанию, указанное в моем примере, должно быть подходящим в целом. Однако, когда мы получаем completeсобытие, что означает, что oneтеперь оно выполнено, мы можем подписаться на следующий Observable; тем самым запускает второй Observable после завершения первого.
Пример наблюдателя, предоставленный для второго Observable, довольно прост. По сути, secondтеперь действует так же, как twoи в OP. В частности, 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
Выполнено!