簡體   English   中英

最后在rxjs序列上在第一個錯誤時執行

[英]Finally on rxjs sequence gets executed on first error

我嘗試在Observable-http調用序列上執行finally語句。

對第一個錯誤執行finally方法,而不是在完成完整序列時執行。

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"));
}

該方法的調用如下所示:

    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")
    )

即使沒有錯誤,在第一個可觀察到的操作完成之后,最終和完整的控制台日志也會被命中:/

有替代功能嗎?

這是finally函數的預期行為和已記錄的行為。 檢查文檔

源可觀察序列優雅地或異常地終止后,調用指定的操作。

同樣通過Rxjs語法,可觀察對象只能發出一個錯誤,這意味着在發生錯誤時完成

發送到Observer對象實例的消息遵循以下語法:onNext *(onCompleted | onError)?

此語法允許可觀察的序列將任何數量(0或更多)的onNext消息發送到訂閱的觀察者實例,還可以選擇后跟單個成功(onCompleted)或失敗(onError)消息。

指示可觀察序列已完成的單個消息可確保該可觀察序列的使用者可以確定性地確定執行清除操作是安全的。

一次失敗進一步確保了可以為在多個可觀察序列上工作的運算符維持中止語義。

要僅在可觀察對象完成時才調用函數,可以使用兩種主要技術:

  • doOnCompleted
  • 使用materialize治療onNextonError ,並且onCompleted作為常規值(和dematerialize ,以獲得正常的行為后)。

但是,對於您的特定情況,我認為該方法是:

  • catch錯誤,並用錯誤代碼替換錯誤(即,不要拋出或強行終止流,返回一個封裝錯誤的值)。 這樣,源可以正常完成,而forkJoin也可以正常完成。

我看不到您的處理程序的代碼,但我想它可能終止了它的可觀察性? 如果是這種情況,您可以返回錯誤代碼,並在所有調用以forkJoinresultSelector參數結束后分析它們的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM