Observables:完成vs最终vs完成

Ale*_*lor 13 rxjs

在谈到Observables(尤其是rxjs)时,"finally"和"done"或"complete"之间有什么区别?

Ale*_*lor 15

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

最后:

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

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!'); }
);
Run Code Online (Sandbox Code Playgroud)

要么

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

虽然这样finally处理:

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

  • **关于rxjs 6+的说明**,您可以最终使用add:/sf/answers/3788087131/ (3认同)

mar*_*tin 5

更准确地说,finally()操作员增加了一个处理手柄.该complete通知只是调用观察员完整的处理程序.

这在实践中意味着什么:

  • 当使用finally()回调时,将在导致取消订阅的每种情况下调用.这是观察者收到的时间completeerror通知,但是当您手动取消订阅时也是如此.

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

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