【问题标题】:How to call a http Observable inside a subscription to another Observable?如何在另一个 Observable 的订阅中调用 http Observable?
【发布时间】: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


【解决方案1】:

我认为你可以这样做:

let searchView;
private searchHistorySubject$: Subject<any> = new Subject<any>();

constructor(){
   this.searchHistoryService.addRecentSearch(searchView).first().subscribe(
     response => {
        //It will entry when you send data through next
     },
     error => {
       console.log(error);
     }
   );
}

...

addRecentSearch(searchView) {
    ...
    return this._searchHistorySubject$.asObservable();
}

setSearchHistoryEvent(value: any) {
  this._searchHistorySubject$.next(value);
}

this.searchSubject
      .switchMap((view: any) => {
          searchView = view;
          this.http.post(this.url, view);
      })
      .subscribe(page => {
          this.searchHistoryService.setSearchHistoryEvent(searchView);
      }
)

【讨论】:

  • 我已经尝试过了,但我希望在 addRecentSearch 中触发一个 observable,所以如果在订阅中我有 this.http.get.('')subscribe() 那么它将被订阅每次
  • 您可以使用 first() 管理订阅。它将采取第一个响应。
  • 我不认为这是问题所要问的,你在哪里有“//当你通过下一个发送数据时它会进入”我想要相当于 this.http.get().sunscribe (),但这是一个坏主意,因为它每次都会订阅,这可能导致内存泄漏,所以我应该在一个主题上调用 next,或者将 observables 组合在一起触发
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 2020-08-29
  • 2019-04-27
  • 1970-01-01
相关资源
最近更新 更多