Hier ist noch eine andere, aber ich fühle mich unkomplizierter und intuitiver (oder zumindest natürlicher, wenn Sie an Versprechen gewöhnt sind). Grundsätzlich erstellen Sie ein Observable mit Observable.create()
Wrap one
und two
als einzelnes Observable. Dies ist sehr ähnlich wiePromise.all()
möglicherweise funktioniert.
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();
}
);
}
);
});
Also, was ist hier los? Zuerst erstellen wir ein neues Observable. Die an übergebene Funktion mit dem Observable.create()
passenden Namen onSubscription
wird an den Beobachter übergeben (erstellt aus den Parametern, an die Sie übergebensubscribe()
), der beim Erstellen eines neuen Versprechens einem einzelnen Objekt ähnelt resolve
und reject
zu einem einzigen Objekt kombiniert wird. So bringen wir die Magie zum Laufen.
In onSubscription
abonnieren wir das erste Observable (im obigen Beispiel wurde dies genannt one
). Wie wir damit umgehen next
und es error
liegt an Ihnen, aber die in meinem Beispiel angegebene Standardeinstellung sollte im Allgemeinen angemessen sein. Wenn wir jedoch die erhaltencomplete
Ereignis erhalten, was bedeutet, dass one
es jetzt abgeschlossen ist, können wir das nächste Observable abonnieren. Dadurch wird das zweite Observable ausgelöst, nachdem das erste abgeschlossen ist.
Der für das zweite Observable bereitgestellte Beispielbeobachter ist ziemlich einfach. Grundsätzlich verhält sich second
jetzt so, wie Sie es two
im OP erwarten würden . Insbesondere second
wird der erste und nur der erste Wert ausgegeben, der von someOtherObservable
(wegen take(1)
) ausgegeben und dann abgeschlossen wird, vorausgesetzt, es liegt kein Fehler vor.
Beispiel
Hier ist ein vollständiges Arbeitsbeispiel, das Sie kopieren / einfügen können, wenn Sie möchten, dass mein Beispiel im wirklichen Leben funktioniert:
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!");
}
);
Wenn Sie sich die Konsole ansehen, wird das obige Beispiel gedruckt:
1
6
Erledigt!