1

Redux Sagas Beginner Tutorial中,我们被告知要像这样编写一个 watcher saga:

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

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

4

2 回答 2

0

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

从撰写传奇:

yield*只允许任务的顺序组合,因此您一次只能让出*给一个生成器

我自己仍在尝试了解所有这些,但也许意味着在每个后续yield*操作中,它都会调用子任务(在您的示例中),但是一旦前一个子任务解决,它就会按顺序执行。如果您要使用,那么对于每个操作,它都会立即调用子任务,并且它们将并行执行和解决。takeEveryINCREMENT_ASYNCincrementAsyncyieldINCREMENT_ASYNC

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

于 2016-08-12T01:59:25.893 回答
0

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

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

我的猜测是关于控制流。如果您的迭代器除了 takeEvery 之外不关心产生任何其他内容,那么我看不出您需要完全放弃控制流的原因。如果您的生成器需要将控制权传递给另一个生成器,然后返回,那么我看到了传递控制权的价值......但是在您的示例中,我没有看到为什么您需要委派给 takeEvery 的代码原因. 如果我不正确,请告诉我。

于 2016-08-04T19:44:55.747 回答