Ожидание нескольких действий перед продолжением в 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 действий не будет выполнено, прежде чем продолжить? Или есть альтернативное решение вышеуказанной проблемы?