我在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的情况。