Oto jeszcze jedno, ale czuję się prostsze i bardziej intuicyjne (lub przynajmniej naturalne, jeśli jesteś przyzwyczajony do obietnic). Zasadniczo tworzysz Observable używając Observable.create()do zawijania onei twojako pojedynczy Observable. Jest to bardzo podobne do tego, jak Promise.all()może działać.
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();
}
);
}
);
});
Więc co się tutaj dzieje? Najpierw tworzymy nowy Observable. Funkcja przekazana do Observable.create(), trafnie nazwana onSubscription, jest przekazywana obserwatorowi (zbudowanemu z parametrów, do których przekazujesz subscribe()), który jest podobny resolvei rejectłączy się w pojedynczy obiekt podczas tworzenia nowej Obietnicy. W ten sposób sprawiamy, że magia działa.
W programie onSubscriptionsubskrybujemy pierwszy Observable (w powyższym przykładzie nazywało się to one). To, jak sobie z tym poradzimy nexti errorzależy od Ciebie, ale ustawienie domyślne podane w mojej próbce powinno być ogólnie odpowiednie. Jednak kiedy otrzymamy completezdarzenie, które oznacza, że onejest już zrobione, możemy zapisać się do następnego Observable; strzelając w ten sposób z drugiego Observable po zakończeniu pierwszego.
Przykładowy obserwator podany dla drugiego Obserwowalnego jest dość prosty. Zasadniczo, secondteraz zachowuje się tak, jak można by się spodziewać twow PO. Dokładniej, secondwyemituje pierwszą i jedyną pierwszą wartość wyemitowaną przez someOtherObservable(z powodu take(1)), a następnie zakończoną, zakładając, że nie ma błędu.
Przykład
Oto pełny, działający przykład, który możesz skopiować / wkleić, jeśli chcesz zobaczyć, jak mój przykład działa w prawdziwym życiu:
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!");
}
);
Jeśli oglądasz konsolę, powyższy przykład wyświetli:
1
6
Gotowe!