【发布时间】:2021-06-18 14:16:46
【问题描述】:
最近,我们开始使用 redux-saga 中间件来管理来自 store 的异步 API 调用。
以前,我们使用基于承诺的通用操作,一旦我们可以在操作本身上使用 async/await 和 .then() 和 .catch(),就可以轻松管理组件流。
承诺:
const fetchCars = async () => {
const {data} = await fetchCarsRequest();
setCars(data);
}
cars.map((car) => <li>{car.name}</li>);
与传奇:
function* fetchCarsSaga() {
try {
const {data} = yield call(fetchCarsService);
yield put(fetchCarsSuccess);
} catch(error) {
yield put(fetchCarsFailure);
}
}
const fetchCars = async () => {
fetchCarsRequest(); //action that calls the above saga
setCars(cars); //state from store
}
cars.map((car) => <li>{car.name}</li>);
在第二个例子中,即使我们使用生成器来处理异步API调用,也不可能使用await语句,所以它在调用fetchCarsRequest之后立即调用setCars函数,尝试将尚不存在的东西设置为组件状态。
所以我的问题是:有没有办法将 await 语句替换为某些东西并等待请求函数(不是异步函数)完成 API 调用?
【问题讨论】:
-
不清楚你在问什么 - 你使用的名称与代码中的函数/生成器名称不完全匹配这一事实无济于事。但是 redux-saga 的
call会自动“等待”一个 Promise 来解决,如果被调用的函数返回一个 Promise - 就像所有的async函数一样。如果您将await放在对fetchCarsRequest的调用之前(因此该函数隐式返回的承诺直到fetchCarsRequest才解决)那么我认为一切都应该正常吗? -
我想我表达得不够好。我的主要疑问是,一旦 saga 处理异步调用,如何等待 API 调用完成调用另一个函数而不使用
await。例如,我想等待 saga 完成 API 调用并将状态设置为 store,以打开成功模式。我该怎么做?
标签: javascript reactjs asynchronous redux redux-saga