未调用 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 => ...);
这将完成。
我正在尝试在执行所有可观察对象时触发回调。在我的另一个较旧的项目中,我像这样使用 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 => ...);
这将完成。