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 one
y two
como 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 resolve
yreject
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 next
y error
depende de usted, pero el valor predeterminado proporcionado en mi muestra debería ser apropiado en general. Sin embargo, cuando recibimos el complete
evento, lo que significa que one
ya 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, second
ahora actúa como lo que esperarías two
que actuara en el OP. Más específicamente, second
emitirá 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!