2016-04-24 2 views
1

ich versuche, eine finally-Anweisung auf einem beobachtbaren auszuführen - Sequenz von http-Anrufen.schließlich auf rxjs Sequenz auf dem ersten Fehler ausgeführt wird

Die schließlich Methode wird auf dem ersten Fehler ausgeführt wird, und nicht, wenn die komplette Sequenze beendet ist.

deleteLeistungsTarife(
    leistungsTarife: Shopeinstellungen.LeistungsTarif[], 
    leistungstarifGeloeschtCallback: (leistungsTarif: Shopeinstellungen.LeistungsTarif) => any) { 
    let observerListe: Observable<number>[] = []; 
    leistungsTarife.forEach((lt) => observerListe.push(
     this.http.delete(this._leistungenUrl + '/DeleteLeistungsTarif/' + lt.tarifLeistungId) 
      .map(res => leistungstarifGeloeschtCallback(lt)) 
      .catch(this.handleError)     
    )); 
    return Observable.forkJoin(observerListe).finally(()=>console.log("finally")); 
} 

der Ruf nach dieser Methode sieht wie folgt aus:

this._leistungenService.deleteLeistungsTarife(
     zuLoeschendeTarife, leistungsTarif => { 
      console.log("gespeichert: ", leistungsTarif) 
     } 
    ).subscribe(
     (r) => console.log("liste result:", r), 
     (e) => console.log("liste error:", e), 
     () => console.log("complete") 
    ) 

Auch kein Fehler ist, erhalten die schließlich und komplette Konsole-Protokolle getroffen, nachdem die erste beobachtbare beendet ist:/

Gibt es dafür eine alternative Funktion?

Antwort

2

Dies ist das erwartete und dokumentierte Verhalten der finally Funktion. Überprüfen Sie die documentation.

Ruft eine angegebene Aktion auf, nachdem die beobachtbare Quellensequenz ordnungsgemäß oder ausnahmsweise beendet wurde.

Auch von Rxjs Grammatik, kann es nur durch eine beobachtbare emittiert ein Fehler sein, was bedeutet, completion when an error occurs:

Nachrichten an Instanzen des Observer-Objekt gesendet, um die folgende Grammatik folgen: OnNext * (OnCompleted | onError)?

Diese Grammatik ermöglicht es beobachtbaren Sequenzen, eine beliebige Menge (0 oder mehr) von onNext-Nachrichten an die abonnierte Beobachterinstanz zu senden, optional gefolgt von einer einzigen Erfolgsmeldung (onCompleted) oder Fehler (onError).

Die einzige Nachricht, die angibt, dass eine beobachtbare Sequenz stellt sicher beendet, dass die Verbraucher der beobachtbaren Folge deterministisch, dass es sicher schaffen können, ist Bereinigungsvorgänge durchzuführen.

Ein einzelner Fehler weiter gewährleistet, dass die Semantik abbrechen kann für Betreiber aufrechterhalten werden, die auf mehreren beobachtbaren Sequenzen arbeiten.

Um eine Funktion nur aufrufen, wenn Beendigung der beobachtbaren, zwei Haupttechniken verwenden können:

  • doOnCompleted
  • Verwendung materialize zu behandeln onNext, onError und onCompleted als reguläre Werte (und dematerialize
      um das normale Verhalten zurück zu bekommen). jedoch

    In Ihrem speziellen Fall, glaube ich, ist der Ansatz zu:

    • catch die Fehler, und ersetzen Sie den Fehler durch einen Fehlercode (dh nicht werfen oder gewaltsam beendet den Strom, Rückkehr ein Wert, der den Fehler kapselt). Auf diese Weise schließt die Quelle normal und die forkJoin auch.

    Ich sehe nicht den Code für Ihren Handler, aber ich nehme an, dass es wahrscheinlich seine beobachtbare beendet?Wenn dies der Fall ist, könnten Sie einen Fehlercode zurückgeben und die Werte aller Anrufe analysieren, sobald sie mit dem resultSelector-Parameter forkJoin abgeschlossen sind.

  • Verwandte Themen