異步action和redux-thunk理解

異步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

相關文章
相關標籤/搜索