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 без реализации, наблюдаемой с помощью редукса. Этот пример содержит случай, когда вызываются несколько создателей действий с избыточностью.

0 ответов

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