Observables:完成vs最终vs完成

时间:2017-06-27 01:21:36

标签: rxjs

在谈到Observables(尤其是rxjs)时,"最终"之间有什么区别?和"完成"或者"完成"?

2 个答案:

答案 0 :(得分:11)

最终总是在可观察序列终止时发生(包括错误);只有当它没有错误地终止时才会完成。

最后:

  

在源可观察序列之后调用指定的操作   优雅地或特殊地终止。

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/finally.md

OnCompleted:

  

Observable在调用onNext之后调用此方法   最后一次,如果没有遇到任何错误。

http://reactivex.io/documentation/observable.html

"完成"不是rx / observables的概念。我刚看到它打印在"完整"的例子中。 /" OnComplete"。

注意:当您致电subscribe时,语法通常为:

observable.subscribe([observer] | [onNext], [onError], [onCompleted]);
// Like this:
observable.subscribe(
    (value) => { ... },
    (error) => { ... },
    () => { console.log('complete!'); }
);

observable.subscribe({
  next: x => console.log('got value ' + x),
  error: err => console.error('something wrong occurred: ' + err),
  complete: () => console.log('done'),
});

finally的处理方式如下:

observable.finally(() => { console.log('finally!'); })
          .subscribe(...) // you can still call subscribe

答案 1 :(得分:5)

更准确地说,finally()运算符添加了一个处置程序处理程序。 complete通知只是在观察者中调用完整的处理程序。

这在实践中意味着什么:

  • 使用finally()时,将在导致取消订阅的每种情况下调用回调。当观察员收到completeerror通知时,以及手动取消订阅时。

    请参阅演示:https://jsbin.com/dasexol/edit?js,console

  • 仅在收到适当的通知时才会调用
  • completeerror个处理程序。只能调用0 - 1个处理程序,但不能同时调用它们。