繁体   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