【发布时间】:2022-01-20 16:10:39
【问题描述】:
我有一个场景,我需要并行进行多个 api 调用。目前,代码使用 redux-saga all 来执行此操作:
try {
const results = yield all(
someIds.map(id =>
call(axios.delete, `/api/somewhere/items/${id}`)
)
);
console.log(results);
yield put(someSuccessFunction)
} catch(e) {
yield put(someFailureFunction)
}
如果所有调用都成功,results 将正确记录为 axios 响应数组,包括headers、request、status 等。但是,即使单个调用失败,代码跳转到catch 块。我无法知道哪个调用失败了。
我已经阅读了How to handle array of requests in redux saga,但在其中的示例中,似乎接受的答案是在每次通话的基础上跟踪成功或失败。我需要知道 all 调用是否成功,如果是,则发送成功操作。如果任何调用失败,我需要知道哪些调用失败,并调度失败或部分失败操作。它可能看起来像这样:
try {
const results = yield all(
someIds.map(id =>
call(axios.delete, `/api/somewhere/items/${id}`)
)
);
const success = results.every(result => result.status === 200);
const failure = results.every(result => result.status !== 200);
const partialFailure =
results.some(result => result.status === 200) &&
results.some(result => result.status !== 200);
if (success) put(someSuccessAction);
if (failure) put(someFailureAction);
if (partialFailure) put(somePartialFailureAction);
} catch(e) {
yield put(someFailureFunction);
}
但是当任何500 响应将我们跳过到 catch 块时,我似乎无法掌握如何检索结果数组。这样做的最佳策略是什么?
【问题讨论】:
标签: javascript reactjs redux-saga