Ich würde gerne auf ein Observable warten können, z
const source = Rx.Observable.create(/* ... */)
//...
await source;
Ein naiver Versuch führt dazu, dass die Wartezeit sofort behoben wird und die Ausführung nicht blockiert wird
Bearbeiten: Der Pseudocode für meinen vollständigen Anwendungsfall lautet:
if (condition) {
await observable;
}
// a bunch of other code
Ich verstehe, dass ich den anderen Code in eine andere separate Funktion verschieben und an den Abonnement-Rückruf übergeben kann, aber ich hoffe, dass ich das vermeiden kann.
javascript
rxjs
ecmascript-7
CheapSteaks
quelle
quelle
.subscribe()
Methodenaufruf verschieben?Antworten:
Sie müssen ein Versprechen an geben
await
. Wandeln Sie das nächste Ereignis des Observablen in ein Versprechen um und warten Sie darauf.Anmerkung bearbeiten: Diese Antwort verwendete ursprünglich .take (1), wurde jedoch in .first () geändert, wodurch das Problem vermieden wird, dass das Versprechen niemals aufgelöst wird, wenn der Stream endet, bevor ein Wert eingeht.
quelle
await observable.first().toPromise();
?first()
führt dies zur Ablehnung undtake(1)
zu einem ausstehenden Versprechen.take(1)
nochfirst()
in solchen Fällen verwenden. Da Sie genau EIN Ereignis erwarten, sollten Sie verwenden,single()
das eine Ausnahme auslöst, wenn mehr als 1 vorhanden ist, und keine Ausnahme auslöst, wenn keine vorhanden ist. Wenn es mehr als einen gibt, stimmt wahrscheinlich etwas in Ihrem Code- / Datenmodell usw. nicht. Wenn Sie nicht single verwenden, werden Sie am Ende willkürlich den ersten Artikel auswählen, der zurückkehrt, ohne zu warnen, dass mehr vorhanden sind. Sie müssten in Ihrem Prädikat für die vorgelagerte Datenquelle darauf achten, dass immer die gleiche Reihenfolge eingehalten wird.import 'rxjs/add/operator/first';
Es muss wahrscheinlich sein
Wie bereits in den Kommentaren erwähnt, gibt es einen wesentlichen Unterschied zwischen
take(1)
und denfirst()
Betreibern, wenn leer und vollständig beobachtbar ist.Observable.empty().first().toPromise()
wird zu einer Ablehnung führen, mitEmptyError
der entsprechend umgegangen werden kann, da es wirklich keinen Wert gab.Und
Observable.empty().take(1).toPromise()
führt zu einer Auflösung mitundefined
Wert.quelle
take(1)
wird kein ausstehendes Versprechen geben. Es wird ein Versprechen geben, das mit gelöst wurdeundefined
.Sie müssen
await
ein Versprechen, also werden Sie verwenden wollentoPromise()
. Sehen Sie diese für weitere Informationen auftoPromise()
.quelle
Wenn
toPromise
es für Sie veraltet ist, können Sie es verwenden,.pipe(take(1)).toPromise
aber wie Sie hier sehen können, ist es nicht veraltet.Verwenden Sie daher bitte
toPromise
(RxJs 6) wie folgt:async / warte Beispiel:
Lesen Sie hier mehr .
Und bitte entfernen Sie diese falsche Behauptung, dass sie
toPromise
veraltet ist.quelle