摘要:改造基于我們之前實現(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ù)并返回, 傳入 store 的 dispatch 和 getState 作為參數(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
摘要:在函數(shù)式編程中,異步操作修改全局變量等與函數(shù)外部環(huán)境發(fā)生的交互叫做副作用通常認為這些操作是邪惡骯臟的,并且也是導(dǎo)致的源頭。 注:這篇是17年1月的文章,搬運自本人 blog... https://github.com/BuptStEve/... 零、前言 在上一篇中介紹了 Redux 的各項基礎(chǔ) api。接著一步一步地介紹如何與 React 進行結(jié)合,并從引入過程中遇到的各個痛點引出 ...
摘要:舉例來說一個異步的請求場景,可以如下實現(xiàn)任何異步的邏輯都可以,如等等也可以使用的和。實際上在中,一個就是一個函數(shù)。 書籍完整目錄 3.4 redux 異步 showImg(https://segmentfault.com/img/bVyou8); 在大多數(shù)的前端業(yè)務(wù)場景中,需要和后端產(chǎn)生異步交互,在本節(jié)中,將詳細講解 redux 中的異步方案以及一些異步第三方組件,內(nèi)容有: redu...
摘要:是官方文檔中用到的異步組件,實質(zhì)就是一個中間件,簡單來說就是一個封裝表達式的函數(shù),封裝的目的是延遲執(zhí)行表達式。這時我們需要對一般異步中間件進行處理。 曾經(jīng)前端的革新是以Ajax的出現(xiàn)為分水嶺,現(xiàn)代應(yīng)用中絕大部分頁面渲染會以異步流的方式進行。在Redux中,如果要發(fā)起異步請求,最合適的位置是在action creator中實現(xiàn)。但我們之前了解到的action都是同步情況,因此需要引入中間...
摘要:寫法一,返回值是一個對象。我們已經(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。就算看的...
摘要:相關(guān)狀態(tài)父組件傳遞給子組件的狀態(tài)。外部狀態(tài)狀態(tài)是可以從視圖庫中移出來的,然后可以使用提供者消費者模式把狀態(tài)重新連接回視圖庫。重新設(shè)計在我看來,重寫是有其必要性的,至少有以下個方面可以改進得更友好。 Redux 學(xué)習(xí)起來很困難?寫起代碼來很啰嗦?一起來看看 Rematch 的作者對 Redux 的思考和簡化吧~ 原文:《Redesigning Redux》, Shawn McKay 都過...
閱讀 2865·2021-11-16 11:55
閱讀 2608·2021-09-29 09:34
閱讀 3405·2021-09-01 14:21
閱讀 3753·2019-08-29 12:36
閱讀 697·2019-08-26 10:55
閱讀 3959·2019-08-26 10:20
閱讀 1026·2019-08-23 18:19
閱讀 1194·2019-08-23 17:56