RxJS - ajax.delete продолжает повторять попытки до тех пор, пока наблюдаемый сбой не произойдет, пока запрос DELETE не будет принят 200 OK
У меня проблемы с ajax.delete
, Я запускаю код ниже, где запрос на удаление от ajax
выполняется, и, если первый сбой, он повторяет попытки, пока запрос не будет успешным.
let RetryStrategy = attempts => attempts
.zip(Observable.range(1, 4))
.flatMap(([error, i]) => {
if (i > 3) {
return Observable.throw('Network error occured')
}
return Observable.timer(i * 1000)
})
export const deleteSurveyQuestionEpic = (action$, {getState, dispatch}) =>
action$.ofType('MY_ACTION')
.switchMap(
action => ajax.delete(`myURL`)
.map(res => res.response)
.flatMap(response => {
console.log(response) // <-- returns null
return arrayRemove('formName', 'questions', 1) // <-- redux-form action-creator
})
.retryWhen(RetryStrategy)
.takeUntil(action$.ofType('MY_CANCEL_ACTION'))
.catch((e) => {
return Observable.of(
errorSurvey((e.xhr && `Error ${e.xhr.statusText}: ${e.xhr.statusText}`) || 'Network error occured')
)
})
)
Проблема в том, что на вкладке сети я вижу, что запрос DELETE возвращает 200 - хорошо, но ajax.delete воспринимает это как ошибку.
При поиске этой проблемы я нашел этот комментарий, где @jayphelps интересуется, выполняет ли браузер запрос CORS.
Это касается меня, когда браузер перед каждым сетевым запросом отправляет запрос CORS, а после этого отправляет обычный запрос.
Я запутался и не уверен, является ли это проблемой, вызванной процессом CORS, или я что-то упускаю в своей реализации, когда запросы PUT и GET работают нормально.
ПРИМЕЧАНИЕ: я пытался добавить игру с ajax.delete
"s crossDomain
вариант, но мне не удалось решить мою проблему.
решаемая
Проблема была довольно легко решаема. Я не вернул Observable от flatMap
, Операторы RxJS должны возвращать наблюдаемые.
.flatMap(response => {
console.log(response) // <-- returns null
// An Observable needs to be returned instead of redux action creator
return arrayRemove('formName', 'questions', 1)
})
Я также сделал этот тест, где я реализовал простой процесс RxJS без реализации, наблюдаемой с помощью редукса. Этот пример содержит случай, когда вызываются несколько создателей действий с избыточностью.