同时执行多个任务

yield 指令可以很简单的将异步控制流以同步的写法表现出来,但与此同时我们将也会需要同时执行多个任务,我们不能直接这样写:

  1. // 错误写法,effects 将按照顺序执行
  2. const users = yield call(fetch, '/users'),
  3. repos = yield call(fetch, '/repos')

由于第二个 effect 将会在第一个 call 执行完毕才开始。所以我们需要这样写:

  1. import { call } from 'redux-saga/effects'
  2. // 正确写法, effects 将会同步执行
  3. const [users, repos] = yield [
  4. call(fetch, '/users'),
  5. call(fetch, '/repos')
  6. ]

当我们需要 yield 一个包含 effects 的数组, generator 会被阻塞直到所有的 effects 都执行完毕,或者当一个 effect 被拒绝 (就像 Promise.all 的行为)。