我正在尝试在执行所有可观察对象时触发回调。在我的另一个较旧的项目中,我使用了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 => ...);
感谢任何帮助。
答案 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())