【发布时间】:2017-11-14 22:27:17
【问题描述】:
我有一个从我们的后端返回过滤器的服务。该服务有一个方法 getForPage 返回一个 promise,还有一个 getForPage$ 返回一个 observable。
在服务上还有 onEvent 方法,它是一个可观察的,当过滤器发生变化时发出。
现在我希望在 onEvent 发出事件时更新 getForPage$ observable。使用以下代码完成。
getForPage(page: string): Promise<DashboardPageFilter[]> {
return this.service.call(
'dashboard.page.filter.getForPage',
{page}
);
}
getForPage$(page: string): Observable<DashboardPageFilter[]> {
let subject = new Subject<DashboardPageFilter[]>();
this.getForPage(page).then(
response => subject.next(response),
response => subject.error(response)
);
this.onEvent().subscribe(() => {
console.log(page);
this.getForPage(page).then(
response => subject.next(response),
response => subject.error(response)
);
});
return subject.asObservable();
}
但是,当我可以路由时,onEvent 上的订阅不会关闭。因此,即使在可观察的主题上不再有活动订阅时,也会调用日志。
如何从可以更新并在路由更改时完成的 promise 中生成 observable?
【问题讨论】:
-
你提到这是服务的一部分,为什么在服务永远不会被销毁/释放的情况下你需要取消订阅?
-
getForPage$()每次在onEvent()上创建一个新订阅。因此,当我在订阅中放置日志并在应用程序中移动一轮,并更改了某些内容时,即使使用旧页面也会多次调用日志。 -
您可以在
this.sub = this.onEvent().subscribe(...)和this.sub.unsubscribe()调用getForPage()时保持订阅和取消订阅 -
这是一种可能性,目前是一个不错的解决方案。但是,不能调用
getForPage$()两次以显示到不同的列表。 -
我不明白为什么你需要一个 getForpage():Promise 和一个 getForPage():Observable,而你可以将 promise 转换为 observable 并将 observable 转换为 promise ^^跨度>