Wie kann ich auf ein Rx Observable „warten“?

Lesezeit: 5 Minuten

Wie kann ich auf ein Rx Observable „warten
GünstigeSteaks

Ich möchte in der Lage sein, auf ein Observable zu warten, zB

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

Ein naiver Versuch führt dazu, dass der await sofort aufgelöst wird und die Ausführung nicht blockiert wird

Bearbeiten: Der Pseudocode für meinen vollständigen beabsichtigten 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 Subscribe-Callback übergeben kann, aber ich hoffe, das vermeiden zu können.

  • Können Sie den verbleibenden Code (den Sie auf die Quelle warten möchten) nicht in a verschieben .subscribe() Methodenaufruf?

    – StriplingWarrior

    9. Dezember 15 um 22:51 Uhr

Wie kann ich auf ein Rx Observable „warten
Macil

Sie müssen ein Versprechen abgeben await. Wandeln Sie das nächste Ereignis des Observables in ein Versprechen um und warten Sie darauf.

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

Hinweis bearbeiten: Diese Antwort verwendete ursprünglich .take(1), wurde aber geändert, um .first() zu verwenden, wodurch das Problem vermieden wird, dass das Promise niemals behoben wird, wenn der Stream endet, bevor ein Wert durchkommt.

Ab RxJS v8, toPromise wird entfernt. Stattdessen kann das obige durch ersetzt werden await firstValueFrom(observable)

  • @apricity Wenn beim Abschluss keine Werte vorhanden waren, first() wird zur Ablehnung führen, und take(1) führt zu ausstehendem Versprechen.

    – Estus-Kolben

    2. Dezember 16 um 10:12 Uhr

  • @apricity @AgentME Eigentlich solltest du beides NICHT verwenden take(1) Noch first()in solchen Fällen. Da Sie genau EIN Ereignis erwarten, sollten Sie verwenden single() die eine Ausnahme auslöst, wenn mehr als 1 vorhanden ist, während keine Ausnahme ausgelöst wird, wenn keine vorhanden ist. Wenn es mehr als eins gibt, ist wahrscheinlich etwas in Ihrem Code / Datenmodell usw. nicht in Ordnung. Wenn Sie Single nicht verwenden, werden Sie am Ende willkürlich das erste Element auswählen, das zurückgegeben wird, ohne dass Sie gewarnt werden, dass es mehr gibt. Sie müssten bei Ihrem Prädikat auf vorgelagerte Datenquelle darauf achten, immer die gleiche Reihenfolge beizubehalten.

    – ntziolis

    22. Juni 17 um 12:47 Uhr


  • Import nicht vergessen: import 'rxjs/add/operator/first';

    – Stéphanie

    14. Februar 18 um 12:29 Uhr

  • Nun, da toPromise() veraltet ist, wie sollen wir das machen?

    – Jus10

    3. August 18 um 17:53 Uhr


  • @ Jus10 Ich kann nichts finden, was darauf hindeutet toPromise() ist veraltet. Wo hast du das gelesen?

    – NickL

    12. Juni 19 um 12:47 Uhr

Verwenden Sie das Neue firstValueFrom() oder lastValueFrom() anstatt toPromise(), die, wie hier erwähnt, ab RxJS 7 veraltet ist und in RxJS 8 entfernt wird.

import { firstValueFrom} from 'rxjs';
import { lastValueFrom } from 'rxjs';

this.myProp = await firstValueFrom(myObservable$);
this.myProp = await lastValueFrom(myObservable$);

Dies ist in RxJS 7+ verfügbar

Sehen: https://indepth.dev/rxjs-heads-up-toromise-is-being-deprecated/

1642899907 288 Wie kann ich auf ein Rx Observable „warten
Estus-Kolben

Wahrscheinlich muss es sein

await observable.first().toPromise();

Wie bereits in den Kommentaren erwähnt, gibt es einen wesentlichen Unterschied zwischen take(1) und first() Operatoren, wenn es ein leeres abgeschlossenes Observable gibt.

Observable.empty().first().toPromise() führt zur Ablehnung mit EmptyError das kann entsprechend gehandhabt werden, weil es wirklich keinen Wert gab.

Und Observable.empty().take(1).toPromise() führt zur Auflösung mit undefined Wert.

  • Tatsächlich take(1) Wille nicht ein ausstehendes Versprechen abgeben. Es wird ein gelöstes Versprechen ergeben undefined.

    – Johan t Hart

    10. Januar 20 um 10:32 Uhr

  • Danke für den Hinweis, das ist richtig. Ich bin mir nicht sicher, warum sich der Beitrag geändert hat, möglicherweise hat sich das Verhalten irgendwann geändert.

    – Estus-Kolben

    10. Januar 20 um 12:52 Uhr

Du wirst brauchen await ein Versprechen, also werden Sie verwenden wollen toPromise(). Sehen Dies für weitere Details auf toPromise().

1642899907 994 Wie kann ich auf ein Rx Observable „warten
Amerika

Bearbeiten:

.toPromise() ist jetzt in RxJS 7 veraltet (Quelle: https://rxjs.dev/deprecations/to-promise)

Neue Antwort:

Als Ersatz für die veraltete Methode toPromise() sollten Sie eine der beiden integrierten statischen Konvertierungsfunktionen firstValueFrom oder lastValueFrom verwenden.

Beispiel:

import { interval, lastValueFrom } from 'rxjs';
import { take } from 'rxjs/operators';
 
async function execute() {
  const source$ = interval(2000).pipe(take(10));
  const finalNumber = await lastValueFrom(source$);
  console.log(`The final number is ${finalNumber}`);
}
 
execute();
 
// Expected output:
// "The final number is 9"

Alte Antwort:

Wenn toPromise für Sie veraltet ist, können Sie verwenden .pipe(take(1)).toPromise aber wie man sieht Hier es ist nicht veraltet.

Also bitte einfach benutzen toPromise (RxJs 6) wie gesagt:

//return basic observable
const sample = val => Rx.Observable.of(val).delay(5000);
//convert basic observable to promise
const example = sample('First Example')
  .toPromise()
  //output: 'First Example'
  .then(result => {
    console.log('From Promise:', result);
  });

async/await-Beispiel:

//return basic observable
const sample = val => Rx.Observable.of(val).delay(5000);
//convert basic observable to promise
const example = await sample('First Example').toPromise()
// output: 'First Example'
console.log('From Promise:', result);

Weiterlesen Hier.

  • toPromise ist veraltet und wurde in RxJS 8 entfernt. Die Dokumentation in Ihrem Link ist veraltet.

    – nmfzone

    21. April 21 um 7:06 Uhr


  • Was bedeutet RX?

    – Jmainol

    20. Mai 21 um 17:27 Uhr

Verwenden toPromise() wird nicht empfohlen, da es ab RxJs 7 abgeschrieben wird. Sie können zwei neue Operatoren verwenden, die in RxJs 7 vorhanden sind lastValueFrom() und firstValueFrom(). Weitere Einzelheiten können gefunden werden Hier

const result = await lastValueFrom(myObservable$);

Implementierungen in der Beta-Version sind hier verfügbar:

  • toPromise ist veraltet und wurde in RxJS 8 entfernt. Die Dokumentation in Ihrem Link ist veraltet.

    – nmfzone

    21. April 21 um 7:06 Uhr


  • Was bedeutet RX?

    – Jmainol

    20. Mai 21 um 17:27 Uhr

Ich verwende RxJS V 6.4.0, daher sollte ich eine veraltete Version in V 7.xx verwenden toPromise(). Inspiriert von anderen Antworten, hier ist, was ich damit gemacht habe toPromise()

import { first, ... } from 'rxjs/operators';

...

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

...

Beachten Sie, wie ich verwendet habe last() in einem pipe(). Denn auf meinem observable.first() funktioniert nicht wie von macil erwähnt

Hoffe, das hilft anderen, die RxJS V 6.xx wie ich verwenden :).

Danke.

.

597320cookie-checkWie kann ich auf ein Rx Observable „warten“?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy