Aquí hay otro enfoque, pero me siento más sencillo e intuitivo (o al menos natural si estás acostumbrado a Promesas). Básicamente, creas un Observable usando Observable.create()para envolver oney twocomo un Observable único. Esto es muy similar a cómo Promise.all()puede funcionar.
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();
}
);
}
);
});
Entonces, ¿qué está pasando aquí? Primero, creamos un nuevo Observable. La función pasada Observable.create(), apropiadamente nombrada onSubscription, se pasa al observador (construido a partir de los parámetros a los que le pasa subscribe()), que es similar a resolveyreject combina en un solo objeto al crear una nueva Promesa. Así es como hacemos que la magia funcione.
En onSubscription, nos suscribimos al primer Observable (en el ejemplo anterior, esto se llamó one). Cómo lo manejamos nexty errordepende de usted, pero el valor predeterminado proporcionado en mi muestra debería ser apropiado en general. Sin embargo, cuando recibimos el completeevento, lo que significa que oneya está hecho, podemos suscribirnos al siguiente Observable; disparando así el segundo Observable después de que el primero esté completo.
El observador de ejemplo proporcionado para el segundo Observable es bastante simple. Básicamente, secondahora actúa como lo que esperarías twoque actuara en el OP. Más específicamente, secondemitirá el primer y único valor emitido por someOtherObservable(debido a take(1)) y luego se completará, asumiendo que no hay error.
Ejemplo
Aquí hay un ejemplo completo y funcional que puede copiar / pegar si desea ver mi ejemplo funcionando en la vida real:
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!");
}
);
Si mira la consola, el ejemplo anterior se imprimirá:
1
6
¡Hecho!