Redux Sagas中的yield *委托运算符

时间:2016-08-04 16:53:59

标签: javascript generator redux redux-saga

Redux Sagas Beginner Tutorial我们被告知写这样一个观察者传奇:

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

为什么我们在第2行使用yield*委托运算符而不仅仅使用yield运算符?不管他们在这里做同样的事情吗?

2 个答案:

答案 0 :(得分:0)

正如LUH3417所说,takeEver是一个生成器,所以你在这个实例中屈服(委托给它)。来自Docs:

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

我的猜测是关于控制流程。如果你的迭代器不关心除了takeEvery之外的任何其他东西,那么我没有看到你需要完全控制流量的原因。如果您的生成器需要将控制权传递给另一个生成器,然后返回,那么我看到了传递控制权的价值......但在您的示例中,我没有看到代码原因,您需要委托给takeEvery 。如果我不对,请告诉我。

答案 1 :(得分:0)

这两个链接可能有助于解释:
http://yelouafi.github.io/redux-saga/docs/advanced/ComposingSagas.html
http://yelouafi.github.io/redux-saga/docs/advanced/SequencingSagas.html(我今天实际上已添加此页面)

从撰写Sagas:

  

yield*仅允许顺序组合任务,因此您一次只能生成*到一个生成器

我仍然试图自己解决所有这些问题,但是yield* takeEvery可能意味着每次后续的INCREMENT_ASYNC操作都会调用子任务incrementAsync在你的例子中)但是在前一个子任务解决后按顺序执行。如果您使用yield,则对于每个INCREMENT_ASYNC操作,它会立即调用子任务,并且它们将并行执行并解析。

使用takeLatesttakeEvery的不同之处在于它取消了之前启动新请求的请求。