RXJs服务返回多个可观察量

时间:2018-03-26 12:45:05

标签: rxjs observable

我有以下searchService.search方法,它返回两个api调用的forkJoin。

我希望调用同时执行,但我也希望每个响应都作为单个对象返回,可以传递到我的SearchSuccess操作并立即处理,而无需等待所有调用完成。目前,它们作为一个响应数组返回,并且仅在完成两个API调用时返回 - 因为这是forkJoin的用途。

我的问题是,我正在努力寻找能够做我想要的其他运营商。

或许代码模式需要重新设计?

动作:

@Effect()
trySearch: Observable<Action> = this.actions$.pipe(
  ofType(SearchActionTypes.TrySearch),
  switchMap((action: TrySearch) =>
    this.searchService.search(action.payload)
        .pipe(
          map((data) => new SearchSuccess(data)),
          catchError(error => of(new SearchFail(error))),
        ),
  ),
);

SearchService(代码段):

search(searchForm: SearchForm): Observable<any> {
  const returnArray = [];

  if (searchForm.searchClients) {
    const searchClientParams = new Search();
    searchClientParams.searchPhrase = searchForm.searchPhrase;
    searchClientParams.type = SearchType.Client;
    const searchClients = this.objectSearch(searchClientParams);
    returnArray.push(searchClients);
  }

  if (searchForm.searchContacts) {
    const searchContactParams = new Search();
    searchContactParams.searchPhrase = searchForm.searchPhrase;
    searchContactParams.type = SearchType.Contact;
    const searchContacts = this.objectSearch(searchContactParams);
    returnArray.push(searchContacts);
  }

  return Observable.forkJoin(returnArray);
}

1 个答案:

答案 0 :(得分:1)

如果我理解正确returnArray包含两个Observable并且您想等到它们都完成但仍然想要分别发出每个结果。

由于forkJoin会在数组中发出所有结果,您可以使用mergeMap(或concatMap)解包它:

this.searchService.search(action.payload)
  .pipe(
    mergeMap(results => results),
    map((data) => new SearchSuccess(data)),
    catchError(error => of(new SearchFail(error))),
  ),