Я отправил действие, в котором массив удаленных пользователей был удален. но при этом в цикле я получаю сообщение об ошибке "Вы предоставили" неопределенный ", где ожидался поток. Вы можете предоставить Observable, Promise, Array или Iterable".
const removeUsersEpic = action$ => {
return action$.ofType(REMOVE_USERS)
.mergeMap((action) => {
for (let i = 0; i < action.payload.length; i++) {
Rx.Observable.ajax({
headers: {'X-Requested-With': 'test', 'Content-Type': 'application/form-data'},
method: 'DELETE',
url: 'https://localhost/api/v1/users/${action.payload[i]}',
body: {}
})
.map((response) => {
return setUserDeleteCount(action.payload.length)
}).toPromise()
.catch((error) => {
console.log(error)
return setUserDeleteExceptionCount(1)
})
}
}
)
}
Api получает вызов в цикле, но после окончания цикла я получаю эту ошибку.
В соответствии с тем, что уже было предложено @kctang, вы можете попробовать что-то в этом направлении
const removeUsersEpic = action$ => {
return action$.ofType(REMOVE_USERS)
.switchMap((action) => {
Rx.Observable.from(action.payload).mergeMap(
payload => Rx.Observable.ajax({
headers: {'X-Requested-With': 'test', 'Content-Type': 'application/form-data'},
method: 'DELETE',
url: 'https://localhost/api/v1/users/${payload}',
body: {}
})
})
}
Вся идея состоит в том, что через Rx.Observable.from(action.payload)
вы создаете Observable, который испускает столько элементов, сколько элементов в массиве action.payload
.
Для каждого испускаемого элемента вы создаете другое Наблюдаемое через Rx.Observable.ajax
.
Вы, чем использовать mergeMap
чтобы сгладить его и получить Наблюдаемый ответ на вызовы Ajax.
Как только вы получите событие типа action$.ofType(REMOVE_USERS)
вы хотите перейти на новый Observable, который мы только что обсуждали, то есть тот, который вы создаете через Rx.Observable.from(action.payload).mergeMap(...)
.
В конце концов вы управляете результатом ваших операций, когда подписываетесь на Наблюдаемый, который вы создали, посредством всех этих преобразований
removeUsersEpic.subscribe(
data => console.log('Delete done - response', data),
err => console.error(err),
() => setUserDeleteCount(action.payload.length)
)
Это просто, чтобы дать вам представление о способе объединения Observables, который должен помочь вам получить то, что вы хотите. Вы можете прочитать эту статью, чтобы иметь некоторые подробности о том, как совместить Наблюдаемый с использованием from
switchMap
и mergeMap
.
subscribe
(если есть). Это () => setUserDeleteCount(action.payload.length)
в приведенном выше примере
mergeMap()
должен возвращать наблюдаемое. В вашем коде он ничего не возвращает (следовательно, не определен). Операторы возврата в вашем коде предназначены для внутреннего потока ajax ().