Aqui está outra, mas me sinto mais direta e intuitiva (ou pelo menos natural se você está acostumado com Promessas), abordagem. Basicamente, você cria um Observable usando Observable.create()
para embrulhar one
e two
como um único Observable. Isso é muito semelhante a como Promise.all()
pode 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();
}
);
}
);
});
Então, o que está acontecendo aqui? Primeiro, criamos um novo Observable. A função passada Observable.create()
, apropriadamente nomeada onSubscription
, é passada ao observador (construída a partir dos parâmetros que você passa subscribe()
), que é semelhante resolve
e reject
combinada em um único objeto ao criar uma nova promessa. É assim que fazemos a mágica funcionar.
Em onSubscription
, assinamos o primeiro Observable (no exemplo acima, isso foi chamado one
). Como lidamos next
e error
depende de você, mas o padrão fornecido em meu exemplo deve ser apropriado em geral. No entanto, quando recebermos o complete
evento, o que significa que one
agora está concluído, podemos nos inscrever no próximo Observable; assim, disparando o segundo Observável após a conclusão do primeiro.
O exemplo de observador fornecido para o segundo Observable é bastante simples. Basicamente, second
agora atua como você esperaria two
agir no OP. Mais especificamente, second
emitirá o primeiro e apenas o primeiro valor emitido por someOtherObservable
( por causa de take(1)
) e, em seguida, será concluído, assumindo que não haja erro.
Exemplo
Aqui está um exemplo funcional completo que você pode copiar / colar se quiser ver meu exemplo funcionando na 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!");
}
);
Se você observar o console, o exemplo acima imprimirá:
1
6
Feito!