1

我面临一些问题ajax.delete。我正在运行下面的代码,其中正在完成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 - OK但 ajax.delete 将其理解为错误。

在寻找这个问题时,我发现了这条评论,@jayphelps 想知道浏览器是否发出了 CORS 请求。

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

一旦 PUT 和 GET 请求正常工作,我很困惑,我不确定这是否是由 CORS 进程引起的问题,或者我在实现中遗漏了一些东西。

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


解决了

这个问题很容易解决。我没有从flatMap. 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) 
})

我也做了这个测试,我实现了一个简单的 RxJS 进程,没有 redux-observable 实现。此示例包含调用多个 redux 操作创建者的情况。

4

0 回答 0