【问题标题】:Fetch data in parallel using Redux Saga使用 Redux Saga 并行获取数据
【发布时间】:2019-06-19 15:26:46
【问题描述】:

我想知道在 Redux Saga 中实现以下行为的正确方法是什么:

  1. 操作由用户交互分派。
  2. 适当的监听传奇现在尝试通过并行调用多个异步方法从 API 获取数据。
  3. 在每次成功响应时,独立于其余请求,将使用检索到的数据分派一个操作(从而更新 UI 等)。
  4. 收集错误响应,然后在所有请求完成后通过单个操作进行分派(例如,以便稍后显示单个错误 Toast)。

我已经通过使用以下模式成功实现了它(对不起,我缺少完整的代码示例,目前不可用):

function* fetchData(dataType) {
  const resp = yield call(MyApi.fetchData, dataType);
  if(!resp.err) {
    yield put(fetchDataSuccess, resp.data);
  } else {
    return resp.err;
  }
}

function* mySaga() {
  const errors = yield all([
    call(fetchData, 'typeOne'),
    call(fetchData, 'typeTwo),
    call(fetchData, 'typeThree)
  ]);
  // errors contains the returned errors
}

这是达到预期效果的最佳方式吗?

【问题讨论】:

  • 我觉得这很好 - 你有什么顾虑?
  • @WillJenkins 感觉有一个生成器函数有时会产生动作效果有时会返回错误是错误的。
  • @Jjang - 不错的配方,通常我为每个 API 结果使用单独的持有人const [one, two, three],因此每个持有人都有其价值,要么是结果,要么是错误。喜欢redux-saga API

标签: javascript reactjs redux redux-saga


【解决方案1】:

您可以使用fork 效果并发发送请求 https://redux-saga.js.org/docs/advanced/ForkModel.html

所以你的代码会变成这样

function* fetchData(dataType) {
  const resp = yield call(MyApi.fetchData, dataType);
  if(!resp.err) {
    yield put(fetchDataSuccess, resp.data);
  } else {
    return resp.err;
  }
}

function* mySaga() {
 yield fork(fetchData, 'typeOne');
 yield fork(fetchData, 'typeTwo');
 yield fork(fetchData, 'typeThree');
}

对于错误处理,您可以从生成器中抛出错误并在主 saga 中处理它。

【讨论】:

  • all 效果也会同时触发它们,有什么区别?你能展示一个主要传奇的草图吗?无法理解您打算如何记录所有错误并在一切完成后一起处理它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多