一些需要注意的关键点
- 直接调用
take()
将会使程序卡死,必须要搭配yield
将控制权交给 Redux-Saga 中间件才能够保证程序的正常运行流程。 - 当 Saga 正在等待 Effect resolve 时,它不能再
take
其他的 Action,也就是 Saga 在等待时是被阻塞的。如果需要 Saga 在等待 Effect resolve 时依旧可以响应其他 Action,可以使用fork
来代替call
实现无阻塞调用。 - 通过
yield
不同内容,可以轻松实现 AJAX 重试。例如以下示例。
function* updateApi(data) {
let retryCounter = 0;
while (retryCounter < 4) {
retryCounter++;
try {
const response = yield call(apiRequest, { data });
return response;
} catch (err) {
yield delay(2000);
}
}
throw new Error('API Request failed.');
}