在Redux Sagas Beginner Tutorial告诉我们写一个守望者传奇是这样的:产量*委托运营
export function* watchIncrementAsync() {
yield* takeEvery('INCREMENT_ASYNC', incrementAsync)
}
为什么我们使用yield*
委托运营商在第2行而不只是yield
操作的?他们都不会在这里做同样的事吗?
在Redux Sagas Beginner Tutorial告诉我们写一个守望者传奇是这样的:产量*委托运营
export function* watchIncrementAsync() {
yield* takeEvery('INCREMENT_ASYNC', incrementAsync)
}
为什么我们使用yield*
委托运营商在第2行而不只是yield
操作的?他们都不会在这里做同样的事吗?
正如LUH3417所说,takeEver是一个生成器,所以在这种情况下你可以屈服(委托给它)。从文档:
function* takeEvery(pattern, saga, ...args) {
while (true) {
const action = yield take(pattern)
yield fork(saga, ...args.concat(action))
}
}
我的猜测是关于控制流。如果你的迭代器不关心除了takeEvery之外的任何其他事情,那么我就没有看到你需要完全控制流量的原因。如果您的生成器需要将控制权交给另一个生成器,然后回来,那么我会看到将控制权交给了...的价值......但在您的示例中,我没有看到代码原因,您为什么需要委派来接管。如果我不正确,请告诉我。
这似乎没有回答我的问题。我不需要委托给发电机的发电机仍然运行,所以**为什么不**只是使用'yield'? – AjaxLeung
我的猜测是关于控制流。如果你的迭代器不关心除了takeEvery之外的任何其他事情,那么我就没有看到你需要完全控制流量的原因。如果您的生成器需要将控制权交给另一个生成器,然后回来,那么我会看到将控制权交给了...的价值......但在您的示例中,我没有看到代码原因,您为什么需要委派来接管。如果我不正确,请告诉我。 –
这两个环节可能有助于解释:
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
的不同之处在于它取消了先前的开始新请求的请求。
链接已经死了,你能否提供替代请求? – Marecky
我猜'takeEvery'返回一个迭代器和'yield *'委托给这个迭代器。一个正常的'yield'只会将这个迭代器返回给调用者。 – ftor
将迭代器返回给调用者的缺点是什么?无论哪种方式,迭代器都会运行,直到耗尽,这就是我想要发生的事情。 – AjaxLeung
调用者似乎自动调用生成器。也许这是Redux Sagas特有的行为。 – AjaxLeung