我有以下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);
}
答案 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))),
),