Redux Saga разница между всеми ([... эффекты]) и всеми (эффекты) - PullRequest
0 голосов
/ 07 февраля 2019

я хочу знать, в чем разница между all([...effects]) и all(effects)

, есть примечания для all(effects) в API, но я не получил

ПримечанияПри параллельном запуске эффектов промежуточное программное обеспечение приостанавливает работу генератора> до тех пор, пока не произойдет одно из следующих действий:

Все эффекты завершены успешно: возобновляет работу генератора с массивом>, содержащим результаты всех эффектов.

Один из эффектов был отклонен до завершения всех эффектов: выбрасывает> ошибку отклонения внутри генератора.

1 Ответ

0 голосов
/ 07 февраля 2019

Если вы уже использовали обещания, запуск all([call(effect1), call(effect2), call(effect3)]) аналогичен Promise.all или jQuery's $ .when .

В документах для всех,Есть 2 синтаксиса, единственное отличие состоит в том, что они возвращают массив результатов или объект результатов.

Когда вы используете любой из синтаксисов, redux-saga будет запускать каждый эффект параллельно, после того как все они завершатся, он вернет результаты в виде массива или объекта.

// all([...effects]) - returns an array of results
const [customers, products] = yield all([
    call(fetchCustomers),
    call(fetchProducts)
])

// all({ a: effectA, b: effectB }) - returns an object of results
const { customers, products } = yield all({
    customers: call(fetchCustomers),
    products: call(fetchProducts)
})

В обоих этих примерах, саге на редукцию немедленно запустятся fetchCustomers и fetchProducts, а когда они оба будут выполнены, он вернет результат обратно в сагу.

Если какой-либо из эффектов потерпит неудачу или выкинетошибка, redux-saga выбросит эту ошибку обратно в ваш сагу / генератор, и вам придется справиться с этим с помощью try/catch


Запуск эффектов параллельно выглядит по сравнению сзапуск их последовательно

// parallel
1. run effect A
2. run effect B
3. wait for responses... (imagine this takes 1 second)
4. get result B
5. get result A
6. continue saga
// sequentially
1. run effect A
2. wait for response.... (imagine this takes 1 second)
3. get result A
4. run effect B
5. wait for response... (wait another second)
6. get result B
7. continue saga
...