我面临一些问题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 操作创建者的情况。