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.