2015-12-09 6 views
31

Ich würde gerne auf eine beobachtbare, z.B.Wie kann ich auf einem Rx Observable "erwarten"?

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

Ein naiver Versuch ergibt die await sofort lösen und nicht die Ausführung blockiert

Edit: Der Pseudo-Code für meine volle beabsichtigte usecase ist:

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

Ich verstehe, dass ich die bewegen kann anderen Code in eine andere separate Funktion und übergeben Sie es in den Rückruf abonnieren, aber ich hoffe, in der Lage, das zu vermeiden.

+0

Können Sie den verbleibenden Code (den Sie auf die Quelle warten möchten) nicht in einen '.subscribe()' Methodenaufruf verschieben? – StriplingWarrior

Antwort

39

Sie müssen ein Versprechen an await übergeben. Wandeln Sie das nächste Event des Observablen in ein Versprechen um und erwarten Sie es.

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

bearbeitet Hinweis: Diese Antwort ursprünglich .take (1), wurde aber geändert verwenden .First(), die das Problem der Verheißung vermeidet nie lösen, wenn der Strom endet, bevor ein Wert kommt durch.

+2

Anstelle von Take (1) könnten Sie 'expect observable.first(). ToPromise();'? – apricity

+0

@apricity Das sollte gleich rauskommen. – AgentME

+8

@apricity Wenn nach Abschluss keine Werte vorhanden waren, führt 'first()' zur Ablehnung, und 'take (1)' führt zu einer ausstehenden Versprechung. – estus

5

Sie müssen await ein Versprechen, so dass Sie toPromise() verwenden möchten. Weitere Informationen zu toPromise() finden Sie unter this.

9

Es hat

await observable.first().toPromise(); 

sein, wie es vorher in den Kommentaren darauf hingewiesen wurde, gibt es erhebliche Unterschiede zwischen take(1) und first() Operatoren, wenn es leer abgeschlossen zu beobachten ist.

Observable.empty().first().toPromise() führt zu einer Ablehnung mit EmptyError, die entsprechend behandelt werden kann, was im Allgemeinen ein wünschenswertes Verhalten ist.

Und Observable.empty().take(1).toPromise() wird ausstehende Versprechen ergeben, was wünschenswert ist ... fast nie.