que ejemplo javascript rxjs ecmascript-7

javascript - ejemplo - ¿Cómo puedo ''esperar'' en un Rx Observable?



rxjs angular (3)

Me gustaría poder esperar en un observable, por ejemplo

const source = Rx.Observable.create(/* ... */) //... await source;

Un intento ingenuo hace que la espera se resuelva de inmediato y no bloquee la ejecución

Editar: El pseudocódigo para mi caso de uso completo es:

if (condition) { await observable; } // a bunch of other code

Entiendo que puedo mover el otro código a otra función separada y pasarlo a la devolución de llamada de suscripción, pero espero poder evitarlo.


Deberá await una promesa, por lo que deberá usar toPromise() . Vea this para más detalles sobre toPromise() .


Tiene que ser

await observable.first().toPromise();

Como se señaló en los comentarios anteriores, hay una diferencia sustancial entre los operadores take(1) y first() cuando hay un observable vacío completo.

Observable.empty().first().toPromise() dará como resultado el rechazo con EmptyError que se puede manejar en consecuencia, lo que generalmente es un comportamiento deseable.

Y Observable.empty().take(1).toPromise() dará como resultado una promesa pendiente, lo cual es deseable ... casi nunca.


Tienes que pasar una promesa para await . Convierta el próximo evento del observable en una promesa y aguarde eso.

if (condition) { await observable.first().toPromise(); }

Nota de edición: Esta respuesta usó originalmente .take (1) pero se cambió para usar .first (), lo que evita que el problema de Promise nunca se resuelva si la secuencia finaliza antes de que llegue un valor.