Запуск тасков параллельно

Ключевое слово 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.all1).

1. Метод Promise.all возвращает обещание, которое выполнится тогда, когда будут выполнены все обещания, переданные в виде перечисляемого аргумента, или отклонено любое из переданных обещаний: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

results matching ""

    No results matching ""