我在整个代码库中都使用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
效果(通常是call
或fork
)产生副作用来实现。如果直接进行操作而不通过redux-saga
效果产生效果,那么redux-saga
将无法协调副作用。
如果您考虑一下,redux-saga生成器是完全可测试的,而无需模拟任何东西。此外,它还有助于使事物保持脱钩状态:如果apiFetchFoo
返回了promise,则传奇故事仍将起作用。
关于redux - Redux Saga异步/等待模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43443620/