Ожидание нескольких действий перед продолжением в redux-saga

Предположим, у вас есть сага, в которой извлекается список элементов. Для каждого полученного элемента вам также понадобится сопутствующий объект. Приведенный ниже псевдокод выбирает некоторых пользователей из API, и для каждого пользователя выполняется новое действие для получения своего аватара.

function* fetchUsers() {
  try {
    const users = yield call(getUsers)
    yield all(
      users.map(({id}) => id).map(id => put(fetchUserAvatar(id)))
    )

    yield put('FETCH_USER_SUCCESS')
  } catch(e) {
    yield put('FETCH_USER_FAILURE')
  }
}

Я хотел бы испустить FETCH_USER_SUCCESS только когда были получены все аватары, т.е. fetchUserAvatar сага испустила либо FETCH_USER_AVATAR_SUCCESS или же FETCH_USER_AVATAR_FAILURE.

Итак, я реализовал следующее решение:

function* fetchUsers() {
  try {
    const users = yield call(getUsers)
    yield all(
      users.map(({id}) => id).map(id => put(fetchUserAvatar(id)))
    )

    for(let i = 0; i < users.length; i++) {
      yield take(['FETCH_USER_AVATAR_SUCCESS', 'FETCH_USER_AVATAR_FAILURE'])
    }

    yield put('FETCH_USER_SUCCESS')
  } catch(e) {
    yield put('FETCH_USER_FAILURE')
  }
}

что кажется мне немного уродливым. Есть ли такой эффект, как takeNили аналогичный метод, в котором я могу дождаться, пока N действий не будет выполнено, прежде чем продолжить? Или есть альтернативное решение вышеуказанной проблемы?

0 ответов

Другие вопросы по тегам