常用辅助函数
辅助函数用于监听特定的被发起到 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。
takeEvery、takeLastest 和 takeLeading 除了可以接受 pattern 之外,还可以接受 channel 作为参数。
作为 Effect 的高级实现,在底层,辅助函数都是由 take 和 fork 联合实现的。例如 takeEvery 的实现实际上是以下形式。
const takeEvery = (patterOrChannel, saga, ...args) =>
fork(function* () {
while (true) {
const action = yield take(patternOrChannel);
yield fork(saga, ...args.concat(action));
}
});