【发布时间】:2021-06-08 10:36:36
【问题描述】:
我有一个现有的操作,它使用 ID 列表作为查询字符串参数调用 api,并获取传递的 ID 的缩略图响应。在某些情况下,ID 计数可以是 150-200 条记录。因此,我正在使用 RxJs 的 forkJoin 和 subscribe 方法使这个 API 调用基于批处理并并行运行。我在实施方面面临以下 3 个问题。
-
我能够在下一个订阅方法中获得基于批处理的响应。但是,在此函数中调用的操作以及响应并未被调用。
-
maxParallelQueries 似乎没有按预期工作。所有的 fetchThumbnailObservables() 都是一次执行的,而不是在设置为常量的 3 个批次中/
-
如何处理 observable 的返回,以便 mergeMap 不会给出语法错误。
Argument of type '({ payload }: IAction) => void' is not assignable to parameter of type '(value: IAction, index: number) => ObservableInput<any>'. Type 'void' is not assignable to type 'ObservableInput<any>'.ts(2345)
这是我当前的代码的样子。任何帮助都会很好。
const getThumbnails: Epic<IAction, IAction, IStoreState> = (action$, state$) =>
action$.ofType(ActionTypes.AssetActions.DATA.FETCH_THUMBNAILS).pipe(
mergeMap( ({ payload }) => {
const assetIds = Object.keys(payload);
const meta = payload;
const batchSize = 10;
const maxParallelQueries = 3;
const fetchThumbnailObservables : Observable<IThumbnailResponse>[] = [];
for (let count = 0; count < assetIds.length; count += batchSize) {
fetchThumbnailObservables.push(AssetDataService.fetchThumbnailData(assetIds.slice(count, count + batchSize)));
}
forkJoin(fetchThumbnailObservables)
.pipe(mergeMap(fetchThumbnailObservable => fetchThumbnailObservable, maxParallelQueries)) // Issue 1 : maxParallelQueries limit is not working
.subscribe({
complete: () => { },
error: () => { },
next: (response) => {
// Issue 2 : below action dont seems to be getting invoked
actions.AssetActions.receivedThumbnailsAction(response, meta)
},
});
// Issue 3 : How to handle return of observable
// Added below code for prevennting error raised by mergeMap( ({ payload }) => {
return new Observable<any>();
}),
catchError((error) => of(actions.Common.errorOccured({ error })))
);
```
【问题讨论】:
标签: reactjs rxjs subscription redux-observable