Вот еще один, но мне кажется более простым и интуитивно понятным (или, по крайней мере, естественным, если вы привыкли к обещаниям) подход. По сути, вы создаете 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
Выполнено!