RxJS5终结运算符未调用

时间:2018-04-09 14:50:22

标签: angular rxjs observable rxjs5

我正在尝试在执行所有可观察对象时触发回调。在我的另一个较旧的项目中,我使用了finally,就像一个魅力:

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

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

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

感谢任何帮助。

3 个答案:

答案 0 :(得分:8)

在可观测量中,射击和完成并不是一回事。

尽管每个项都会发出一个值,但是根据定义,route.queryParams永远不会完成,因为这是Angular实现它的方式,作为一个非终止的observable。您需要手动完成它才能执行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 => ...);

这将完成。

答案 1 :(得分:0)

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

如果合并的Observable没有完成,则永远不会调用finally

答案 2 :(得分:0)

如果你想在observable完成时做某事,那么使用完整的回调而不是finally / finalize:

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

无论如何最终/ finalize也应该有效,并且会在出错或完成时被调用。我很确定你的观察结果永远不会完成。您可以使用我上面的代码确认这一点。

我看到你正在使用Angular并订阅永远不会完成的this.route.queryParams。您可以使用first()创建一个新的可观察对象,以便获得该值并立即完成:this.route.queryParams.pipe(first())