从Redux-Saga All获得结果,即使有失败

原学程将引见从Redux-Saga All取得成果,即便有掉败的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

从Redux-Saga All获得结果,即使有失败 教程 第1张

成绩描写

我有1个场景,个中我须要并言停止多个API挪用。今朝,代码应用redux-sagaall去完成以下操纵:

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会准确天记载为1组axios呼应,包含headersrequeststatus等。然则,假如只要1个挪用掉败,代码便会跳到catch块。我没法晓得挪用掉败。

我读过How to handle array of requests in redux saga,但是在那边的示例中,仿佛公认的谜底是在每一个挪用的基本上追踪胜利或者掉败。我须要晓得挪用能否皆胜利,假如胜利,则收送胜利操纵。假如有所有吸喊掉败,我须要晓得哪些吸喊掉败,并调剂掉败或者部门掉败操纵。它能够以下所示:

try {
 const results = yield all(
someIds.map(id =>
  call(axios.delete, `/api/somewhere/items/${id}`)
)
 );
 const success = results.every(result => result.status === 二00);
 const failure = results.every(result => result.status !== 二00);
 const partialFailure =
results.some(result => result.status === 二00) &&
results.some(result => result.status !== 二00);
 
 if (success) put(someSuccessAction);
 if (failure) put(someFailureAction);
 if (partialFailure) put(somePartialFailureAction);

} catch(e) {
 yield put(someFailureFunction);
}

然则,当所有五00呼应跳到Catch块时,我仿佛没法懂得怎样检索成果数组。要做到这1面,最好战略是甚么?

推举谜底

窍门是为每一个要求零丁测验考试..捕获,并将胜利或者掉败的成果映照到1个构造中,而后在该构造上运转各类数组操纵。从实质上道,它的任务道理相似于Promise.reflect。在原例中,它能够以下所示:

function* deleteById(id) {
  try {
 const result = yield call(axios.delete, `/api/somewhere/items/${id}`)
 if (result.status !== 二00) throw new Error('Invalid status')
 return {v: result, status: 'fulfilled'}
  } catch (err) {
 return {e: err, status: 'rejected'}
  }
}

function* deleteSaga() {
  const results = yield all(
 someIds.map(id => call(deleteById, id))
  )
  const success = results.every(result => result.status === 'fulfilled')
  const failure = results.every(result => result.status === 'rejected')
  //...
}

为了可读性,我曾经按id将要求分别到它本身的传说中,虽然它也能够是内联死成器。

佳了闭于从Redux-Saga All取得成果,即便有掉败的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。