一些需要注意的关键点

  1. 直接调用 take() 将会使程序卡死,必须要搭配 yield 将控制权交给 Redux-Saga 中间件才能够保证程序的正常运行流程。
  2. 当 Saga 正在等待 Effect resolve 时,它不能再 take 其他的 Action,也就是 Saga 在等待时是被阻塞的。如果需要 Saga 在等待 Effect resolve 时依旧可以响应其他 Action,可以使用 fork 来代替 call 实现无阻塞调用。
  3. 通过 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.');
}