最后在第一个错误上执行rxjs序列

时间:2016-04-24 21:37:23

标签: javascript sequence rxjs observable

我尝试在Observable上执行finally语句 - http-calls序列。

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

即使没有错误,在第一个observable完成后,最终和完整的控制台日志也会被命中:/

这有替代功能吗?

1 个答案:

答案 0 :(得分:2)

这是finally函数的预期和记录的行为。检查documentation

  

在源可观察序列正常或异常终止后调用指定的操作。

同样通过Rxjs语法,一个observable只能发出一个错误,这意味着completion when an error occurs

  

发送到Observer对象实例的消息遵循以下语法:onNext *(onCompleted | onError)?

     

此语法允许可观察序列将任何数量(0或更多)的onNext消息发送到订阅的观察者实例,可选地后跟一个成功(onCompleted)或失败(onError)消息。

     

指示可观察序列已完成的单个消息确保可观察序列的使用者可以确定性地确定执行清理操作是安全的。

     

单个故障进一步确保可以为处理多个可观察序列的运算符维护中止语义。

要仅在完成observable时调用函数,您可以使用两种主要技术:

  • doOnCompleted
  • 使用materializeonNextonErroronCompleted视为常规值(以及dematerialize以恢复正常行为)。

在您的特定情况下,我认为方法是:

  • catch错误,并用错误代码替换错误(即不要抛出或强制终止流,返回封装错误的值)。这样,源正常完成,forkJoin也是如此。

我没有看到你的处理程序的代码,但我想它可能会终止它的可观察性?如果是这种情况,您可以返回错误代码,并在resultSelector参数forkJoin完成后分析所有通话的值。