我在整个代码库中都使用async / await。因此,我的api调用是由异步函数定义的

async function apiFetchFoo {
  return await apiCall(...);
}

我想从我的传奇代码中调用此函数。看来我做不到:
// Doesn't work
function* fetchFoo(action) {
  const results = await apiFetchFoo();
  yield put({type: "FOOS_FETCHED_SUCCESSFULLY", foos: results});
}

但是,这确实有效,并且与redux saga文档匹配:
// Does work
function* fetchFoo(action) {
  const results = yield call(apiFetchFoo);
  yield put({type: "FOOS_FETCHED_SUCCESSFULLY", foos: results});
}

这是将Redux Saga与异步/等待结合使用的正确方法吗?在saga代码中使用此生成器语法是标准的,而在其他地方使用async / await模式是标准的吗?

最佳答案

是的,这是使用Redux-Saga的标准方法。

永远不要直接在saga-generator内部调用await函数,因为redux-saga是编排的副作用。因此,任何时候要产生副作用,都应该通过redux-saga效果(通常是callfork)产生副作用来实现。如果直接进行操作而不通过redux-saga效果产生效果,那么redux-saga将无法协调副作用。

如果您考虑一下,redux-saga生成器是完全可测试的,而无需模拟任何东西。此外,它还有助于使事物保持脱钩状态:如果apiFetchFoo返回了promise,则传奇故事仍将起作用。

关于redux - Redux Saga异步/等待模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43443620/

10-11 06:35