2016-01-15 126 views
7

我试图得到什么人会考虑人们如何组织他们的反应+终极版应用程序的网络调用的最佳实践的一些想法。我通常让我的组件进行调用,获取数据,然后将其传递给一个将会减少的操作。这是最好的做法,还是将网络从我的组件中分离出来,并将该逻辑放在应用程序中的其他位置,也许在减速器中更好?如果把网络电话在反应+终极版应用

回答

4

进行网络通话的最佳位置在您的动作创作者中。但是,您将需要一些中间件来实现最佳效果。看看这个promise-middleware(实际上,我建议查看整个教程)。如果使用该中间件,则可以让操作创建者返回一个承诺,并且还有三种操作类型 - 一个用于请求,一个用于处理成功的响应,另一个用于处理失败的请求。然后,你只要听你的减速器中的那3个动作。

因此与中间件,你可以有一个动作的创造者是这样的:

function networkCall() { 
    return { 
     types: ['MAKE_REQUEST', 'REQUEST_SUCCESS', 'REQUEST_FAILURE'], 
     promise:() => { 
      return new Promise((resolve, reject) => { 
       $.ajax({ 
        url: 'example.com/api' 
        type: 'GET' 
       }); 
      }) 
     } 
    } 
} 

很明显,你可以自由地建立自己的诺言中间件,但应该设置你在正确的方向。

1

你可以使用API​​中间件,或者redux-api-middleware或者你自己的东西(这对write one不是很难)。

然后,例如,你的行动创造者可以返回操作,如

{type: 'API_GET', url: '/api/userList', nextType: 'USER_LIST'} 

...这将通过将发送实际的请求,然后分派像一个新的动作中间件后处理:

{type: 'USER_LIST_FETCHED', status: 200, payload: [{id: 1, ...}, ...]} 
{type: 'USER_LIST_FAILED', status: 404, payload: {message: '...'}} 
2

我认为这是一件事是正确的角度来完成。您的所有网络电话整齐地放置在您的services中。这很容易在Redux中完成。

该文档正确地表明,网络电话是在你actions。我把它们分成一个单独的地方,你可以称之为“服务”。在那里你可以定义所有的常量,比如你的API服务器URL,认证相关的东西等。这将是唯一知道你的网络调用实现细节的地方 - 你使用哪个库(jQuery,axios,superagent,等等)。

你的行为将文件从这些服务中导入功能,并呼吁他们。如果您稍后决定更换网络库,则不必更改actions

相关问题