【发布时间】:2018-04-09 11:24:51
【问题描述】:
我有一个主题被订阅并在用户搜索时触发。
let searchView;
this.searchSubject
.switchMap((view: any) => {
searchView = view;
this.http.post(this.url, view);
})
.subscribe(page => {
this.searchHistoryService.addRecentSearch(searchView).subscribe();
})
searchHistoryService.addRecentSearch 记录此搜索,以便用户可以查看他们最近的搜索。
我认为这不是一个好习惯,因为每次都订阅 observable,我宁愿使用我正在调用 .next() 的主题,或者将历史调用与搜索调用本身结合起来。
如果 searchHistoryService.addRecentSearch 返回一个主题,我可以调用 .next() 但我应该在哪里订阅它?
我尝试在 searchHistoryService 的构造函数中添加它
this.searchHistorySubject.do(observableIWantToCall()).subscribe()
然后用这个替换对“addRecentSearch”的订阅:
this.searchHistoryService.searchHistorySubject.next(searchView)
但它不起作用。
内部的 observable,observableIWantToCall() 被调用,但返回的 observable 没有订阅。
这有什么问题,当另一个完成发射时订阅一个可观察对象的最佳实践是什么?
【问题讨论】:
-
使用
.switchMap(..).concatMap(page => this.searchHistoryService.addRecentSearch(searchView)).subscribe() -
这个问题是订阅返回'addRecentSearch'的结果,而不是switchMap中可观察的结果
-
我更改了顺序,将我想要的结果放在最后,并使用 flatMap 将它们组合起来
标签: javascript angular rxjs observable reactive-programming