并行运行任务
yield
语句非常适合以线性方式表示异步控制流,但我们也需要并行执行操作。我们不能写
// wrong, effects will be executed in sequence
const users = yield call(fetch, '/users')
const repos = yield call(fetch, '/repos')
因为第二个效果只有在第一个调用解析后才会执行。相反,我们必须写
import { all, call } from 'redux-saga/effects'
// correct, effects will get executed in parallel
const [users, repos] = yield all([
call(fetch, '/users'),
call(fetch, '/repos')
])
当我们生成一个效果数组时,生成器会被阻塞,直到所有效果都解析或只要有一个被拒绝(就像Promise.all
的行为一样)。