Redux Sagaのタイムアウトのハンドリング方法

sagaでtakeを使うといつまでも待ち受けてしまうことがあるので、タイムアウトとエラーのハンドリングをうまいことやるには以下のようにやるとよさそうです。

yield put(actions.requestRefreshUsers());
const { success, error, timeout } = yield race({
        success: take('success'),
        error: take('failure'),
        timeout: delay(5000).then(() => true),
      });
      if (error) {
        throw new Error('fail refresh users.');
      }
      if (timeout) {
        throw new Error('refresh users has timeout.');
      }

参考

https://qiita.com/k_tada/items/8f92260f62d4a2c9ae69

https://redux-saga.js.org/docs/advanced/RacingEffects.html

http://mizchi.hatenablog.com/entry/2017/05/08/013632

https://medium.com/@rukurx/redux-saga%E3%81%A7%E7%A2%BA%E8%AA%8D%E7%94%A8%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B-6c76f4ee189c

https://qiita.com/kuy/items/716affc808ebb3e1e8ac