我使用redux-observable
来发送一个带有某些承诺结果转换的动作。
我们说我有这样的API调用:
const fetchSomething = () => callAndReturnPromise('some-endpoint')
使用这些动作创建者:
const fetchSomethingSuccess = response => ({ type: 'SUCCESS', payload: response })
const fetchSomethingError = error => ({ type: 'ERROR', payload: error })
我可以在解决或拒绝fetchSomething
时为这两种情况创建操作。
我希望我的史诗能够采取所有的' FETCH'操作并使用fetchSomething
函数使用适当的操作创建者为新节点添加已解决或拒绝的promise值。
我的史诗看起来像这样:
const fetchSomethingEpic = action$ =>
action$
.ofType('FETCH')
.switchMap(() =>
Observable
.fromPromise(fetchSomething())
.map(fetchSomethingSuccess)
.catch(error => Observable.of(fetchSomethingError(error)))
);
问题是当发生错误时它会停止工作。
当fetchSomething
生成的承诺正在解决时,一切都很顺利,将使用map传递的转换调度新动作。但是当承诺被拒绝时,在' FETCH'
-
更多信息
callAndReturnPromise('some-endpoint)
看起来像这样:
const callAndReturnPromise = endpoint => new Promise((resolve, reject) => {
fetch(endpoint)
.then(response => {
if (checkIsCool(response)) {
resolve(response);
} else {
reject(response)
}
})
})
调试后我得到类似的内容,让我们用F,S,E命名流中的动作(获取,成功和错误)
----F----S------F-------F------S
^ there occurred an error but no action was sent
答案 0 :(得分:1)
问题是当发生错误时它会停止工作
你能更具体一点吗?究竟什么停止工作,你怎么知道?有什么错误吗?等
我确实立刻看到了一个问题,但这可能是一个解析错误,所以它可能只是你问题中的一个错字:从箭头函数返回一个Object需要在括号中包裹花括号。
// before
const fetchSomethingSuccess = response => { type: 'SUCCESS', payload: response }
const fetchSomethingError = error => { type: 'ERROR', payload: error }
// after
const fetchSomethingSuccess = response => ({ type: 'SUCCESS', payload: response })
const fetchSomethingError = error => ({ type: 'ERROR', payload: error })
虽然在这种特定情况下它可能是一个解析错误,但在某些情况下,它会默默地实际解析为具有labeled statement的块,这对许多人来说非常混乱。
e.g。这是完全有效的JavaScript,不是解析错误:
const fetchSomethingSuccess = response => { type: 'SUCCESS' }
在这种情况下,{ type: 'SUCCESS' }
是一个带有无关标签的字符串语句的块,两者都不以任何方式使用或返回。可以认为它在功能上等同于:
const fetchSomethingSuccess = function (response) {
type: 'SUCCESS'; // extraneous
// no return
};
根据我们的进一步对话和新提供的代码:
我将提供的代码添加到jsbin中,它看起来像我期望的那样工作,ERROR
动作被正确调度。 https://jsbin.com/rujemak/edit?js,output