如何在订阅另一个Observable中调用http Observable?

时间:2018-04-09 11:24:52

标签: javascript angular rxjs observable reactive-programming

我有一个订阅的主题,并在用户搜索时触发。

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返回一个Subject我可以调用.next()但我会在哪里订阅它?

我尝试在searchHistoryService的构造函数

中添加它
this.searchHistorySubject.do(observableIWantToCall()).subscribe()

然后将订阅替换为' addRecentSearch'有了这个:

this.searchHistoryService.searchHistorySubject.next(searchView)

但它不起作用。

内部observable,observableIWantToCall()被调用,但是oborderable返回并未订阅。

这有什么不对,当另一个人完成发放时订阅观察者的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

我认为你可以这样做:

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);
      }
)