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 one
i two
jako 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 resolve
i reject
łączy się w pojedynczy obiekt podczas tworzenia nowej Obietnicy. W ten sposób sprawiamy, że magia działa.
W programie onSubscription
subskrybujemy pierwszy Observable (w powyższym przykładzie nazywało się to one
). To, jak sobie z tym poradzimy next
i error
zależy od Ciebie, ale ustawienie domyślne podane w mojej próbce powinno być ogólnie odpowiednie. Jednak kiedy otrzymamy complete
zdarzenie, które oznacza, że one
jest 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, second
teraz zachowuje się tak, jak można by się spodziewać two
w PO. Dokładniej, second
wyemituje 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!