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 onee twocomo 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 resolvee rejectcombinada 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 nexte errordepende de você, mas o padrão fornecido em meu exemplo deve ser apropriado em geral. No entanto, quando recebermos o completeevento, o que significa que oneagora 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, secondagora atua como você esperaria twoagir no OP. Mais especificamente, secondemitirá 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!