常用辅助函数
辅助函数用于监听特定的被发起到 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));
}
});