2016-01-15 49 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

相關問題