国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

簡單粗暴實現(xiàn)redux的thunk和promise中間件

jzman / 3111人閱讀

摘要:改造基于我們之前實現(xiàn)的簡單對于它的函數(shù)進行處理。我們規(guī)定要把對象放入屬性中。一個簡易的異步處理方法已經(jīng)實現(xiàn)了。但是反觀對的改造沒有什么統(tǒng)一性代碼很難維護和擴展是可以配置中間件來擴展配置的。

文章地址

異步處理

我們使用 redux 處理數(shù)據(jù)流時候, 一個比較令人頭疼的問題就是關(guān)于異步操作。Action 發(fā)出以后,過一段時間再執(zhí)行 Reducer,這就是異步。在哪個階段處理異步, Reducer 作為一個純函數(shù), 不適合承擔(dān)此類功能, 理論上也承擔(dān)不了, Action 存放一個對象, 作為消息的載體自己更不能進行異步操作。想一想就發(fā)現(xiàn)可以在 dispatch 這個發(fā)送 Action 的方法上做文章。如果我們能在異步操作的不同階段發(fā)送不同的 Action 我們就可以完成異步操作了。

改造 dispatch

基于我們之前實現(xiàn)的簡單 redux, 對于它的 dispatch 函數(shù)進行處理。使它具有處理我們異步邏輯的能力。

有時候看源碼總能感覺到作者對代碼邏輯處理的很優(yōu)雅, 以及對于功能的可擴展性把握的很好,但是往往這些優(yōu)美的代碼,理解起來需要很多其他方面的知識基礎(chǔ), 這也是很多人看源碼困難很大的原因。我們這里對與 redux 中間件的處理在后續(xù)再去討論, 這里我們就以一種比較蠢的方法簡單粗暴的實現(xiàn)我們想要的功能

加入 Thunk 能力
    
    ...
    const dispatch1 = store.dispatch
    store.dispatch = arg => {
        if (typeof arg === "function") return arg(store.dispatch, getState)
        dispatch1(arg)
    }
    ...
    

這里邏輯異常簡單, 先把原來的 dispatch 函數(shù)存儲起來, 判斷 dispatch 傳入的參數(shù)類型, 如果參數(shù)類型為 function 則執(zhí)行改函數(shù)并返回, 傳入 storedispatchgetState 作為參數(shù), 使得 dispatch 具有處理函數(shù)參數(shù)的能力。

加入處理 Promise 能力

其實上面的 thunk 我們已經(jīng)有了處理異步的能力, 但是每次我們要自己去手動觸發(fā)三個 action, 工作量還是很大的?,F(xiàn)在 ajax 很多都會包裝為 promise 對象, 因此我們可以對與 dispatch 增加一層判斷, 使得它具有處理具有 promise 屬性的 action 的能力。

    
    ...
    const dispatch2 = store.dispatch
    
    store.dispatch = action => {
        if (isPromise(action.payload)) {
            const { type, payload, params } = action
            dispatch2({
                type: `${type}_PENDDING`,
                params
            })
            payload.then(
                resolve => {
                    dispatch2({
                        type: `${type}_SUCCESS`,
                        content: resolve,
                        params
                    })
                },
                reject => {
                    dispatch2({
                        type: `${type}_ERROR`,
                        content: reject,
                        params
                    })
                }
            )
        } else {
            dispatch2(action)
        }
    }
    ...
    

我們規(guī)定 action 要把 promise 對象放入 payload 屬性中。當接收到 payload 屬性為 promise 對象的 action 時候, 我們這里硬編碼直接觸發(fā)該 type_PENDDING 事件。等到該 promise 狀態(tài)改變后, 我們根據(jù)它成功與否分別觸發(fā) _SUCCESS_ERROR 事件, 這樣我們就可以把異步邏輯包裝為 promise 對象放在 action 中, 然后我們在 reducer 中分別處理這幾種類型的事件即可。

測試和思考

我們現(xiàn)在可以在項目(reacts-ggsddu)中分別去 dispatch 一個函數(shù)和一個帶有 promise 對象的 action 可以看到分別的請求效果。 一個簡易的異步處理方法已經(jīng)實現(xiàn)了。

但是反觀對 dispatch 的改造沒有什么統(tǒng)一性, 代碼很難維護和擴展, redux 是可以配置中間件來擴展配置的。我們后面再去研究。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/89380.html

相關(guān)文章

  • Redux 進階 - react 全家桶學(xué)習(xí)筆記(二)

    摘要:在函數(shù)式編程中,異步操作修改全局變量等與函數(shù)外部環(huán)境發(fā)生的交互叫做副作用通常認為這些操作是邪惡骯臟的,并且也是導(dǎo)致的源頭。 注:這篇是17年1月的文章,搬運自本人 blog... https://github.com/BuptStEve/... 零、前言 在上一篇中介紹了 Redux 的各項基礎(chǔ) api。接著一步一步地介紹如何與 React 進行結(jié)合,并從引入過程中遇到的各個痛點引出 ...

    Godtoy 評論0 收藏0
  • 精益 React 學(xué)習(xí)指南 (Lean React)- 3.4 掌控 redux 異步

    摘要:舉例來說一個異步的請求場景,可以如下實現(xiàn)任何異步的邏輯都可以,如等等也可以使用的和。實際上在中,一個就是一個函數(shù)。 書籍完整目錄 3.4 redux 異步 showImg(https://segmentfault.com/img/bVyou8); 在大多數(shù)的前端業(yè)務(wù)場景中,需要和后端產(chǎn)生異步交互,在本節(jié)中,將詳細講解 redux 中的異步方案以及一些異步第三方組件,內(nèi)容有: redu...

    JouyPub 評論0 收藏0
  • Redux異步間件

    摘要:是官方文檔中用到的異步組件,實質(zhì)就是一個中間件,簡單來說就是一個封裝表達式的函數(shù),封裝的目的是延遲執(zhí)行表達式。這時我們需要對一般異步中間件進行處理。 曾經(jīng)前端的革新是以Ajax的出現(xiàn)為分水嶺,現(xiàn)代應(yīng)用中絕大部分頁面渲染會以異步流的方式進行。在Redux中,如果要發(fā)起異步請求,最合適的位置是在action creator中實現(xiàn)。但我們之前了解到的action都是同步情況,因此需要引入中間...

    wums 評論0 收藏0
  • react+redux+router異步數(shù)據(jù)獲取教程

    摘要:寫法一,返回值是一個對象。我們已經(jīng)知道,中間件只關(guān)注函數(shù)的傳遞,而且也不關(guān)心函數(shù)的返回值,所以只需要讓認識這個函數(shù)就可以了。 react的FLUX數(shù)據(jù)流一直搞不清楚,他不像Angular的雙向數(shù)據(jù)綁定,做一個model獲取數(shù)據(jù),然后通過controller來管理view上的數(shù)據(jù)顯示就可以了。單項數(shù)據(jù)流引入了太多的概念,state、action、reducer、dispatch。就算看的...

    Arno 評論0 收藏0
  • 重新設(shè)計 Redux

    摘要:相關(guān)狀態(tài)父組件傳遞給子組件的狀態(tài)。外部狀態(tài)狀態(tài)是可以從視圖庫中移出來的,然后可以使用提供者消費者模式把狀態(tài)重新連接回視圖庫。重新設(shè)計在我看來,重寫是有其必要性的,至少有以下個方面可以改進得更友好。 Redux 學(xué)習(xí)起來很困難?寫起代碼來很啰嗦?一起來看看 Rematch 的作者對 Redux 的思考和簡化吧~ 原文:《Redesigning Redux》, Shawn McKay 都過...

    kidsamong 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<