Eccone ancora un altro, ma mi sento più diretto e intuitivo (o almeno naturale se sei abituato a Promesse), approccio. Fondamentalmente, crei un osservabile usando Observable.create()
per avvolgere one
e two
come un singolo osservabile. Questo è molto simile a come Promise.all()
potrebbe funzionare.
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();
}
);
}
);
});
Allora, cosa sta succedendo qui? Innanzitutto, creiamo un nuovo Observable. La funzione passata Observable.create()
, giustamente chiamata onSubscription
, viene passata all'osservatore (costruito dai parametri a cui si passa subscribe()
), che è simile a resolve
ereject
combinato in un unico oggetto quando si crea un nuovo Promise. È così che facciamo funzionare la magia.
In onSubscription
, ci iscriviamo al primo Observable (nell'esempio sopra, questo è stato chiamato one
). Come gestiamo next
e error
dipende da te, ma l'impostazione predefinita fornita nel mio campione dovrebbe essere appropriata in generale. Tuttavia, quando riceviamo l' complete
evento, il che significaone
ora è , possiamo iscriverci al prossimo Observable; sparando così il secondo Observable dopo che il primo è stato completato.
L'esempio di osservatore fornito per il secondo Observable è abbastanza semplice. Fondamentalmente, second
ora si comporta come ci si aspetterebbe two
di comportarsi nell'OP. Più specificamente, second
emetterà il primo e unico valore emesso da someOtherObservable
(a causa ditake(1)
) e quindi completo, assumendo che non ci siano errori.
Esempio
Ecco un esempio completo e funzionante che puoi copiare / incollare se vuoi vedere il mio esempio lavorare nella vita reale:
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!");
}
);
Se guardi la console, l'esempio sopra verrà stampato:
1
6
Fatto!