2015-12-09 14 views
31

Mi piacerebbe essere in grado di attendere su un osservabile, ad es.Come posso `attendere 'su un Rx Osservabile?

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

ingenuo risultati tentativo nella await risolvendo immediatamente e non bloccano l'esecuzione

Edit: Il pseudocodice per il mio pieno caso d'uso previsto è:

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

ho capito che posso spostare il altro codice in un'altra funzione separata e passarlo nel callback di sottoscrizione, ma spero di poterlo evitare.

+0

Non si può spostare il codice rimanente (che si desidera attendere per l'origine) in una chiamata di metodo '.subscribe()'? – StriplingWarrior

risposta

39

È necessario passare una promessa a await. Converti il ​​prossimo evento osservabile in una promessa e attendi ciò.

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

Modifica nota: Questa risposta .Prendere originariamente utilizzato (1), ma è stato cambiato per usare .first(), che evita il problema della Promessa mai risolvere se il flusso finisce prima un valore passa attraverso.

+2

Invece di take (1) potresti usare 'await observable.first(). APromise();'? – apricity

+0

@apricity che dovrebbe uscire lo stesso. – AgentME

+8

@apricity Se non ci sono valori al completamento, 'first()' comporterà il rifiuto, e 'take (1)' si tradurrà in una promessa in sospeso. – estus

5

Avrete bisogno di await una promessa, quindi vorrete usare . Vedi this per maggiori dettagli su toPromise().

9

Va

await observable.first().toPromise(); 

Come è stato notato nei commenti prima, v'è una sostanziale differenza tra take(1) e first() operatori quando è vuoto completato osservabile.

Observable.empty().first().toPromise() provocherà il rifiuto con EmptyError che può essere gestito di conseguenza, che è generalmente un comportamento desiderabile.

E Observable.empty().take(1).toPromise() si tradurrà in una promessa in sospeso, che è auspicabile ... quasi mai.

Problemi correlati