在Redux Sagas Beginner Tutorial中,我们被告知要像这样编写一个 watcher saga:
export function* watchIncrementAsync() {
yield* takeEvery('INCREMENT_ASYNC', incrementAsync)
}
为什么我们yield*
在第 2 行使用委托操作符而不仅仅是yield
操作符?他们不会在这里做同样的事情吗?
在Redux Sagas Beginner Tutorial中,我们被告知要像这样编写一个 watcher saga:
export function* watchIncrementAsync() {
yield* takeEvery('INCREMENT_ASYNC', incrementAsync)
}
为什么我们yield*
在第 2 行使用委托操作符而不仅仅是yield
操作符?他们不会在这里做同样的事情吗?
这两个链接可能有助于解释:http:
//yelouafi.github.io/redux-saga/docs/advanced/ComposingSagas.html
http://yelouafi.github.io/redux-saga/docs/advanced/SequencingSagas.html(我这个页面实际上是今天添加的)
从撰写传奇:
yield*
只允许任务的顺序组合,因此您一次只能让出*给一个生成器
我自己仍在尝试了解所有这些,但也许意味着在每个后续yield*
操作中,它都会调用子任务(在您的示例中),但是一旦前一个子任务解决,它就会按顺序执行。如果您要使用,那么对于每个操作,它都会立即调用子任务,并且它们将并行执行和解决。takeEvery
INCREMENT_ASYNC
incrementAsync
yield
INCREMENT_ASYNC
使用的takeLatest
不同之处takeEvery
在于它取消了先前的请求以启动新的请求。
正如 LUH3417 所说, takeEver 是一个生成器,所以在这种情况下你屈服(委托给它)。从文档:
function* takeEvery(pattern, saga, ...args) {
while (true) {
const action = yield take(pattern)
yield fork(saga, ...args.concat(action))
}
}
我的猜测是关于控制流。如果您的迭代器除了 takeEvery 之外不关心产生任何其他内容,那么我看不出您需要完全放弃控制流的原因。如果您的生成器需要将控制权传递给另一个生成器,然后返回,那么我看到了传递控制权的价值......但是在您的示例中,我没有看到为什么您需要委派给 takeEvery 的代码原因. 如果我不正确,请告诉我。