未调用 RxJS5 finalize 运算符

RxJS5 finalize operator not called

我正在尝试在执行所有可观察对象时触发回调。在我的另一个较旧的项目中,我像这样使用 finally 并且效果很好:

this.myService.callDummy()
  .finally(() => console.log('Works!'))
  .subscribe(result => ...)

但现在我正在使用带有 管道运算符 的较新版本的 RxJS,但是 finally 调用(现在已重命名为 finalize)永远不会得到执行。找不到什么信息,我不确定我做错了什么。

combineLatest(
  this.route.queryParams,
  this.myService.callDummy1(),
  this.myService.callDummy2()
)
.pipe(finalize(() => console.log('Does not work!')))
.subscribe(results => ...);

感谢任何帮助。

您确定组合 Observable 中的一个确实完成了吗?使用 .complete.error?

如果组合 Observable 中的 none 完成,将永远不会调用 finally

如果你想在 observable 完成时做一些事情,那么使用 complete 回调而不是 finally/finalize:

.subscribe(
    value => { console.log(`Next: ${value}`); },
    error => { console.log(`Error: ${error}`); },
    ()    => { console.log(`Completed`); }
);

无论如何 finally/finalize 也应该可以工作,并且会在错误或完成时调用。我很确定您的可观察对象永远不会完成。您可以使用我上面的代码来确认这一点。

我看到您正在使用 Angular 并订阅了 this.route.queryParams,但从未完成。您可以使用 first() 创建一个新的可观察对象,这样您就可以获得值并立即完成:this.route.queryParams.pipe(first())

在可观察对象中,触发和完成不是一回事。

即使每个项目都发出一个值,route.queryParams 根据定义永远不会完成,因为这就是 Angular 实现它的方式,作为一个非终止的可观察对象。您需要手动完成它才能执行 finalize,因为 combineLatest 只会在其中组合的每个可观察对象完成时完成。

combineLatest(
  this.route.queryParams.pipe(take(1)), // take(1) will complete the observable after it has emitted one value
  this.myService.callDummy1(),
  this.myService.callDummy2()
)
.pipe(finalize(() => console.log('Does not work!')))
.subscribe(results => ...);

这将完成。