異步action通常指的就是異步action建立函數html
action建立函數分爲同步action建立函數和異步action建立函數react
同步action建立函數(最多見的):git
function requestPosts(subreddit) { return { type: REQUEST_POSTS, subreddit } }
異步action建立函數(若是利用了redux-thunk,也叫thunk action建立函數,經過使用指定的 middleware,action 建立函數除了返回 action 對象外還能夠返回函數。這時,這個 action 建立函數就成爲了 thunk):github
// 來看一下咱們寫的第一個 thunk action 建立函數! // 雖然內部操做不一樣,你能夠像其它 action 建立函數 同樣使用它: // store.dispatch(fetchPosts('reactjs')) export function fetchPosts(subreddit) { // Thunk middleware 知道如何處理函數。 // 這裏把 dispatch 方法經過參數的形式傳給函數, // 以此來讓它本身也能 dispatch action。 return function (dispatch) { //redux-thunk使得能夠dispatch該函數 // 首次 dispatch:更新應用的 state 來通知 // API 請求發起了。 dispatch(requestPosts(subreddit)) // thunk middleware 調用的函數能夠有返回值, // 它會被看成 dispatch 方法的返回值傳遞。 // 這個案例中,咱們返回一個等待處理的 promise。 // 這並非 redux middleware 所必須的,但這對於咱們而言很方便。 return fetch(`http://www.subreddit.com/r/${subreddit}.json`) .then( response => response.json(), // 不要使用 catch,由於會捕獲 // 在 dispatch 和渲染中出現的任何錯誤, // 致使 'Unexpected batch number' 錯誤。 // https://github.com/facebook/react/issues/6895 error => console.log('An error occurred.', error) ) .then(json => // 能夠屢次 dispatch! // 這裏,使用 API 請求結果來更新應用的 state。 dispatch(receivePosts(subreddit, json)) ) } }
經過使用redux-thunk中間件,使得能夠dispacth一個函數,該函數被thunk中間件調用,且該函數的返回值會做爲dispatch方法的返回值,該例中最後返回的是一個promisejson
store.dispatch(fetchPosts('reactjs')).then(() => console.log(store.getState()))
像 redux-thunk 或 redux-promise 這樣支持異步的 middleware 都包裝了 store 的 dispatch()
方法,以此來讓你 dispatch 一些除了 action 之外的其餘內容,例如:函數或者 Promise。 redux
當 middleware 鏈中的最後一個 middleware 開始 dispatch action 時,這個 action 必須是一個普通對象。這是 同步式的 Redux 數據流 開始的地方(譯註:這裏應該是指,你可使用任意多異步的 middleware 去作你想作的事情,可是須要使用普通對象做爲最後一個被 dispatch 的 action ,來將處理流程帶回同步方式)api