当节点被拒绝时,如何继续使用相同的流?

时间:2017-06-14 16:53:53

标签: javascript rxjs redux-observable

我使用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

1 个答案:

答案 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