【问题标题】:RXJS Observable doSomething onCompleteRXJS Observable doSomething onComplete
【发布时间】:2016-11-07 09:18:05
【问题描述】:

我想使用 RXJS Observable。基本上它工作正常,但我不仅需要在 observer.next() 时做出反应,还需要在调用 observer.complete() 时做出反应。 如何获取 RXJS Observable 的 OnComplete 事件?在我看来,RXJS 文档令人困惑。

export class Service {
    myMethod():Observable<any> {
        return Observable.create((observer:any) => {
        for(let i=0; i<10; i++) {
         observer.next(i);
        }
        if(true==true) {
            // this event I need
            observer.complete();
        } else {
            observer.error(xhr.response);
        }
    }
}

export class Component() {
    // constructor etc.

    doSome() {
        this.service.myMethod()
        // Here I would like to get OnComplete event
          .catch(this.handleError)
          .subscribe((num:any) => {
            console.log(num);
        });
    }
}

【问题讨论】:

    标签: typescript angular rxjs observable


    【解决方案1】:

    subscribe 方法接受三个回调。最后一个是完整的事件。

    doSome() {
      this.service.myMethod()
          .subscribe((num:any) => {
            console.log(num);
          }, (err) => {
            this.handleError(err);
          }, () => { // <----
            this.handleComplete();
          });
    }
    

    您也可以为此利用 finally 运算符。

    doSome() {
      this.service.myMethod()
          .catch(this.handleError)
          .finally(this.handleComplete) // <----
          .subscribe((num:any) => {
            console.log(num);
        });
    }
    

    注意: 如果我们有错误,这两个示例之间存在差异: 如果我们添加console.logs,我们会在第一种情况下看到 只打印handleError

    -> handleError
    

    第二种情况

    -> handleError
    -> finally
    

    换句话说,finally 总是被调用,complete 不是。

    【讨论】:

    • 这对我有用 .finally( () => this.handleComplete )
    • 第一种情况下两者是有区别的,如果报错,handleComplete不会被调用但finalize(finalize)总是被调用
    • 较新的 rxjs 有 ffinalize 运算符,您可以在管道内使用它
    【解决方案2】:

    正如 Thierry Templier 回答的那样,一种选择是利用 finally/finalize (rxjs docs) (但和使用complete事件不一样,见注释)


    最后

    完成某事的另一种选择是last (rxjs/last)

    【讨论】:

    • 谢谢,这有点令人困惑,最终在完成或取消订阅时执行,注释中根本没有说明。
    猜你喜欢
    • 2019-10-02
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2021-06-25
    • 2018-10-24
    相关资源
    最近更新 更多