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 oneund twoals 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 onSubscriptionwird an den Beobachter übergeben (erstellt aus den Parametern, an die Sie übergebensubscribe() ), der beim Erstellen eines neuen Versprechens einem einzelnen Objekt ähnelt resolveund rejectzu einem einzigen Objekt kombiniert wird. So bringen wir die Magie zum Laufen.
In onSubscriptionabonnieren wir das erste Observable (im obigen Beispiel wurde dies genannt one). Wie wir damit umgehen nextund es errorliegt an Ihnen, aber die in meinem Beispiel angegebene Standardeinstellung sollte im Allgemeinen angemessen sein. Wenn wir jedoch die erhaltencomplete Ereignis erhalten, was bedeutet, dass onees 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 secondjetzt so, wie Sie es twoim OP erwarten würden . Insbesondere secondwird 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!