我知道Redux Saga 的all([...effects])
效果组合器非常类似于Promise.all
实用程序,但我还没有找到类似于Promise.any
行为的东西:
- 同时运行所有效果
- 如果所有效果都失败,则失败(否则成功)
- 如果失败,则抛出所有错误
AggregateError
- 如果成功,则不返回任何结果或仅返回第一个结果(来自多个结果)
例如:
export function* getHomeDataSaga() {
yield* any([
call(getTopUsersSaga, { payload: undefined }),
call(getFavoritesSaga, { payload: undefined }),
call(getTrendingTokensSaga, { payload: undefined }),
call(getTopCollectionsSaga, { payload: { itemsPerPage: 9, page: 1 } }),
]);
}
当你想把多个(分解的)传奇组合成一个传奇时,这将是非常有用的,它不会快速失败,但会完成所有的效果。
答案
基于Martin Kadlec的答案最终使用:
export function* anyCombinator(effects: SagaGenerator<any, any>[]) {
const errors = yield* all(
effects.map((effect) =>
call(function* () {
try {
yield* effect;
return null;
} catch (error) {
return error;
}
}),
),
);
if (errors.every((error) => error !== null)) {
throw new AggregateError(errors);
}
}
1条答案
按热度按时间ivqmmu1c1#
目前还没有这样的效果,但是您可以创建自己的实用程序来为您执行这些操作。
any
功能与all
功能非常相似,在一种情况下,您将获得所有的结果/错误,而在另一种情况下,您将获得第一个成功/失败的结果。因此,您可以轻松地获得any
功能,方法是为成功时抛出的每个项目翻转all
效果-〉,并在出错时返回。如果你不想取消其他传奇一旦一个成功,事情变得有点棘手,因为在标准的叉树主要传奇(例如getHomeDataSaga)会等到所有分叉的saga(任务运行者)完成后再继续。为了绕过这个问题,我们可以使用
spawn
效应,这将不会阻止主 Saga ,虽然它有一些其他的含义(eidogg.如果你杀死他们的主传奇,衍生的传奇将继续运行)。类似这样的东西应该可以做到这一点:
我在这里使用自定义通道将生成的跑步者的结果发送到实用程序 Saga ,这样我就可以根据我的需要对每个完成的跑步者做出React。