RxJS - ajax.delete继续重试,直到observable失败而DELETE请求为200 OK

时间:2017-07-26 14:45:40

标签: redux rxjs rxjs5 redux-observable rxjs-dom

我在ajax.delete面临一些问题。我正在运行下面的代码,其中正在执行来自ajax DELETE 请求,如果第一个失败,它会一直重试,直到请求成功。

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将其理解为错误。

在查找此问题时,我发现this comment @jayphelps想知道浏览器是否发出了CORS请求。

对我来说就是这种情况,而浏览器在每个网络请求之前发出一个CORS请求,然后发出常规请求。

我很困惑,我不确定这是一个由CORS流程引起的问题,还是我的实现中遗漏了一些问题,一旦PUT和GET请求正常工作。

注意: 我尝试使用ajax.delete crossDomain选项添加游戏,但我没有设法解决我的问题。

解决

问题很容易解决。 我没有从flatMap返回一个Observable。 RxJS运算符必须返回一个observable。

.flatMap(response => {
    console.log(response) // <-- returns null
    // An Observable needs to be returned instead of redux action creator
    return arrayRemove('formName', 'questions', 1) 
})

我还创建了this test,我实现了一个简单的RxJS进程而没有redux-observable实现。此示例包含调用多个redux actions-creators的情况。

0 个答案:

没有答案