如何在redux-observable epic中执行2个异步调用,并对每个结果执行return / dispatch操作

时间:2018-04-20 14:21:40

标签: rxjs rxjs5 redux-observable

我有一个动作,要求我去服务器,获取2块数据,然后获取那些,然后分别为每个数据块调度一个动作。 这是在动作$ .ofType(PROCESSDATA)时完成的。 对rxjs来说很新,我无法找到正确的组合。

epic = (action$) => {
    return action$.ofType(PROCESSDATA)
        //should I be using switchMap? It is for initialising data 
        //so I figure no point in carrying on with original request 
        //if a new one comes in
        .switchMap(action=>{
            //is merge right? return statement currently just gives me
            //an error about my epic does not return a stream
            const token = localStorage.getItem('token');
            return Observable.merge(
               Observable.ajax({
                 url:'/first',
                 headers:{Authorization:'Bearer ' + token}
                })
               .map(r=>{type:PROCESSFIRST, data:r.response, item:action.item}),
               Observable.ajax({
                 url:'/second',
                 headers:{Authorization:'Bearer ' + token}
                })
               .map(r=>{type:PROCESSSECOND, data:r.response}),

            )
        })
}

我这样做的原因(如果它没有意义)是我已经有一个使用redux-thunk(和axios)的应用程序,我试图用redux-observable替换它的一部分得到它的悬念,这就是为什么我想为redux-thunk发出2个动作(PROCESSFIRST和PROCESSSECOND)来处理,因为它们已经被照顾了。所以我只是在中间放一步,看看我是否可以使用redux-observable,但我非常喜欢rxjs等

最终我想使用返回的数据触发延续操作,然后完成。 此外,如果您有时间,应该如何以及在何处处理错误。

更新 好的,所以我才意识到我需要在史诗的顶部有一个return语句。这让我摆脱了第一个错误。 然后我使用mapTo而不是map,我正在使用r.data,它应该有r.response。令人惊讶的是现在一切正常。但我没有正确处理错误或没有以正确的方式调用它。 所以,由于我所说的使用redux-thunk的现有项目,我有一个控制它的actionCreator:

initState = (lang) => {
   return dispatch => new Promise(resolve,reject){
     const pr1 = dispatch({type:INIT_STATE});
     //this was another thunk that returned a Promise which did the axios
     //calls to the server, dispatched the relevant continuation action 
     //and then either resolved or rejected
     //and then dispatched further actions to process the results
     const pr2 = dispatch(processData()); 
     Promise.all([pr1,pr2])
       .then(r=>resolve(true))
       .catch(e=>reject(e))
   }
}

我已将const pr2 = ....改为:

const pr2 = dispatch({type:PROCESSDATA})

,从而将史诗换成史诗并将其他所有内容保持不变。这似乎触发了史诗和处理数据,但例如,如果我使用错误的网址,没有任何事情发生(按预​​期),但更重要的是我没有发现错误。那么我需要更改以捕获该错误? 提前谢谢

0 个答案:

没有答案