常用辅助函数

辅助函数用于监听特定的被发起到 Store 的 Action,并在这些 Action 被发起时执行指定任务。根据 Saga 发起方式的不同,Redux-Saga 提供了以下辅助函数。

  • takeEvery(pattern, saga, ...args),对每一个匹配的 pattern 都派生一个 saga,并将 args 传递给 saga,当前的 Action 将被追加到 args 末尾传递给 saga
  • takeLatest(pattern, saga, ...args),对匹配 pattern 的 Action 派生一个 saga 并取消之前所有已启动的匹配的执行。
  • takeLeading(pattern, saga, ...args),对匹配 pattern 的 Action 派生一个 saga,并阻塞后续的匹配直到派生的 saga 执行完毕。
  • throttle(ms, pattern, saga, ...args),对匹配 pattern 的 Action 派生一个 saga,但仍将新传入的 Action 接收到缓存中,但只保留最新的一个,并在指定 ms 毫秒的时间内暂停 saga 的派生。也就是说 throttle 会在 saga 派生后的指定时间内忽略新传入的 Action。

takeEverytakeLastesttakeLeading 除了可以接受 pattern 之外,还可以接受 channel 作为参数。

作为 Effect 的高级实现,在底层,辅助函数都是由 takefork 联合实现的。例如 takeEvery 的实现实际上是以下形式。

const takeEvery = (patterOrChannel, saga, ...args) =>
  fork(function* () {
    while (true) {
      const action = yield take(patternOrChannel);
      yield fork(saga, ...args.concat(action));
    }
  });