2016-08-04 76 views
0

Redux Sagas Beginner Tutorial告诉我们写一个守望者传奇是这样的:产量*委托运营

export function* watchIncrementAsync() { 
    yield* takeEvery('INCREMENT_ASYNC', incrementAsync) 
} 

为什么我们使用yield*委托运营商在第2行而不只是yield操作的?他们都不会在这里做同样的事吗?

+3

我猜'takeEvery'返回一个迭代器和'yield *'委托给这个迭代器。一个正常的'yield'只会将这个迭代器返回给调用者。 – ftor

+0

将迭代器返回给调用者的缺点是什么?无论哪种方式,迭代器都会运行,直到耗尽,这就是我想要发生的事情。 – AjaxLeung

+0

调用者似乎自动调用生成器。也许这是Redux Sagas特有的行为。 – AjaxLeung

回答

0

正如LUH3417所说,takeEver是一个生成器,所以在这种情况下你可以屈服(委托给它)。从文档:

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

我的猜测是关于控制流。如果你的迭代器不关心除了takeEvery之外的任何其他事情,那么我就没有看到你需要完全控制流量的原因。如果您的生成器需要将控制权交给另一个生成器,然后回来,那么我会看到将控制权交给了...的价值......但在您的示例中,我没有看到代码原因,您为什么需要委派来接管。如果我不正确,请告诉我。

+0

这似乎没有回答我的问题。我不需要委托给发电机的发电机仍然运行,所以**为什么不**只是使用'yield'? – AjaxLeung

+0

我的猜测是关于控制流。如果你的迭代器不关心除了takeEvery之外的任何其他事情,那么我就没有看到你需要完全控制流量的原因。如果您的生成器需要将控制权交给另一个生成器,然后回来,那么我会看到将控制权交给了...的价值......但在您的示例中,我没有看到代码原因,您为什么需要委派来接管。如果我不正确,请告诉我。 –

0

这两个环节可能有助于解释:
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操作,它将立即调用子任务,并且它们将并行执行并解析。

使用takeLatesttakeEvery的不同之处在于它取消了先前的开始新请求的请求。

+0

链接已经死了,你能否提供替代请求? – Marecky