我有一个服务从我们的后端返回过滤器。此服务有一个返回promise的方法getForPage
和一个返回一个observable的getForPage$
。
在服务上还有方法onEvent
,它是一个可观察的,当过滤器发生变化时会发出。
现在我希望在getForPage$
发出事件时更新onEvent
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
上完成订阅时,我将无法关闭。因此,即使没有关于主题可观察的活动订阅,也会调用日志。
如何根据可以更新并在路线更改时完成的承诺进行观察?
答案 0 :(得分:0)
您可以改为使用merge
运算符:
getForPage$(page: string): Observable<DashboardPageFilter[]> {
const obsFromPromise = Observable.fromPromise(this.getForPage(page));
const result = this.onEvent.switchMap(() => Observable.fromPromise(this.getForPage(page)));
return Observable.merge(obsFromPromise, obsFromEvent)
}
通过这样做,您的承诺和您的事件将合并到一个没有订阅的observable中。
有关合并运算符的更多详细信息,请参见rxjs documentation website。
答案 1 :(得分:0)
在更多尝试解决问题后,评论中的一些想法和对代码的重新审视我找到了解决问题的方法。然而,这还有另一个小问题
在代码生活在observable之外进行更新之前。使用下面的代码更新实时内部观察者。
return Observable.create((observer: Observer<DashboardPageFilter[]>) => {
this.getForPage(page).then(
response => observer.next(response),
response => observer.error(response)
);
let sub = this.onEvent().subscribe(() => {
console.log(page);
this.getForPage(page).then(
response => observer.next(response),
response => observer.error(response)
);
});
return function () {
sub.unsubscribe();
};
});
主要是回调,它取消订阅取消订阅。
然而,在角度调整中,您需要在调用取消订阅之前将路线更改为其他路线(因此不同的参数不同)。