首页 文章

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

提问于
浏览
1

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

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)

但它不起作用 .

内部可观察,observableIWantToCall()被调用,但是oborderable返回并未订阅 .

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

1 回答

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

相关问题