Запускайте параллельные эффекты саги, не отменяя ни одного из них. - PullRequest
0 голосов
/ 25 июня 2018

Я бы хотел запустить параллельные эффекты с redux-сагой, не бросая, если произойдет ошибка.

Использование эффекта all от redux-saga, если:

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

По сути, я хочу дождаться окончания всех эффектов, чтобы вызвать действие. Я хочу сделать что-то подобное, но заменив all чем-то другим:

export function* getSaga() {
  yield put(request());
  try {
    yield all([fetchItems1, fetchItems2, fetchItems3]);
    // Wait for all to resolve or get rejected, then dispatch succeed.
    yield put(actions.succeeded());
  } catch (e) {
    // This should never happen.
  }
}

Я пытался использовать fork, но он отменяет все другие задачи, если одна из них не удалась. И я попытался использовать spawn, но он не ждет, пока задачи завершат отправку succeeded.

При использовании обычного JS есть шаблон под названием отражает , который я хотел бы применить к саге.

Как мы можем этого достичь?

Спасибо

1 Ответ

0 голосов
/ 26 июня 2018

Следуя ответу из связанной проблемы переполнения стека, вы можете так же легко создать сагу reflect и использовать ее таким же образом:

function* reflect(saga) {
  try {
    return { v: yield call(saga), status: 'fulfilled' }
  } catch (err) {
    return { e: err, status: 'rejected' }
  }
}
...
yield all([fetchItems1, fetchItems2, fetchItems3].map(reflect));

Рабочий пример: https://codesandbox.io/s/y2vx74jzqv

...