Ich hatte ein Problem und löste es, möchte aber Antworten auf mehrere Fragen erhalten. Ich musste einige Daten per Post-Methode mit Angular HttpClient senden. Am Anfang habe ich das Anfordern auf diese Weise implementiert:

this.http.post<{name: string}>('some/url/address', {name}, httpOptions).subscribe((response) => {
  console.log('the request was sucessfull' + response.name);
});

Als ich das Abonnement entfernte, bemerkte ich jedoch, dass die Anfrage überhaupt nicht startet. Ich beendete die Umwandlung des Beobachtbaren in ein solches Versprechen:

this.http.post<{name: string}>('some/url/address', {name}, httpOptions).toPromise();

Und es funktioniert richtig. Meine Fragen sind:

  1. Gibt es einen besseren Weg, das zu tun?
  2. Was wären negative Auswirkungen dieser Lösung?
  3. Gibt es eine Möglichkeit, es als beobachtbar zu halten, aber ohne Abonnement zu starten?
  4. Was ist der Grund für ein solches Verhalten? Leistungsoptimierung?

Vielen Dank im Voraus für die Antworten.

2
Georgi Naumov 21 Feb. 2020 im 19:50

3 Antworten

Beste Antwort

1.) Ich denke, dein erster Weg ist gut mit dem Abonnieren.

2.) Ein negativer Effekt der Versprechenslösung ist, dass wir die Funktionalität der reichhaltigen RxJS-Bibliothek loslassen und in Versprechensland gehen. Wir können map, switchMap, mergeMap, catchError, withLatestFrom und eine Reihe anderer unterschiedlicher Operatoren von RxJS nicht nutzen. Ein weiterer negativer Einfluss auf die Versprechen-Route besteht darin, dass ein Versprechen, sobald es "geflogen" ist, entweder mit Erfolg oder mit Fehler zurückkehren muss. Mit einem Observable können wir es, obwohl wir es abonnieren und an "fly" senden, während des Flugs (bevor der Rückruf des Abonnements beginnt) mit {{X2 }} und ein API-Aufruf wird nicht durchgeführt.

3.) Dies ist nicht möglich, ein Stream muss abonniert werden, damit er gesendet wird / "fliegt".

4.) Ja, du bist richtig. Eine Art Verbindung zu 2, bei der Sie eine reichhaltigere Erfahrung erzielen können, indem Sie retry, catchError, takeUntil das Abonnement kündigen können.

3
AliF50 21 Feb. 2020 im 17:08

Gibt es einen besseren Weg, dies zu tun?

Ja, Sie sollten den Aufruf an einen Dienst verschieben und nur zurückgeben: this.http.post <{name: string}> ('some / url / address', {name}, httpOptions); Anschließend können Sie den Dienst aufrufen und die Methode in Ihrer Komponente abonnieren.

Was wären negative Auswirkungen dieser Lösung?

Sie sollten relevanten Code in Teile aufteilen: Komponenten / Dienste / Status usw., damit er besser lesbar und schneller zu finden ist.

Gibt es eine Möglichkeit, es als beobachtbar zu halten, aber ohne Abonnement zu starten?

Nein. Sie können ein Versprechen zurückgeben, dann die aufrufende Funktion in eine asynchrone ändern und auf das Ergebnis des Versprechens warten.

Was ist der Grund für ein solches Verhalten? Leistungsoptimierung?

Nein, so funktionieren Observablen. Observables müssen abonniert werden, um feuern zu können. Ansonsten sitzen sie einfach da und tun nichts.

1
Mickers 21 Feb. 2020 im 17:12

subscribe ist die Methode zur Ausführung eines Observable. Wenn Sie entfernen, dass keine Ausführung erfolgt, wurde die Anforderung überhaupt nicht ausgelöst.

Wenn Sie eine andere Frage beantworten, sollten Sie herausfinden, warum Sie Observable verwenden sollten.

Sie können sie abbrechen, erneut versuchen, als Stream kombinieren und mit anderen rxjs-Operatoren usw. arbeiten.

1
Mujah Maskey 21 Feb. 2020 im 17:06