Запуск тасков параллельно
Ключевое слово yield
отлично подходит для представления асинхронного потока управления в простом и линейном стиле, но нам также нужно выполнять параллельно что-то ещё.
Мы не можем просто написать:
// неправильно, Effect-ы будут выполняться последовательно
const users = yield call(fetch, '/users'),
repos = yield call(fetch, '/repos')
Потому что 2-й Effect не будет выполнен, пока не будет получен результат первого вызова. Вместо этого мы должны написать так:
import { all, call } from 'redux-saga/effects'
// правильно, Effect-ы будут выполняться параллельно
const [users, repos] = yield all([
call(fetch, '/users'),
call(fetch, '/repos')
])
Когда мы возращаем массив используя yield
таким образом, то, генератор блокируется до тех пор, пока все Effect-ы не будут завершены или пока хотя бы один не вернет reject (Promise.reject) (работает также как Promise.all
1).
1. Метод Promise.all возвращает обещание, которое выполнится тогда, когда будут выполнены все обещания, переданные в виде перечисляемого аргумента, или отклонено любое из переданных обещаний: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise/all ↩