vuex 的dispatch原始碼解讀

2021-09-27 08:28:45 字數 1364 閱讀 1320

vuex 原始碼的**:

在介紹dispatch之前,先介紹乙個函式:subscribeaction。

首先通過官方文件來看一下這個api的作用:

訂閱 store 的 action。handler會在每個 action 分發的時候呼叫並接收 action 描述和當前的 store 的 state 這兩個引數:

store.subscribeaction((action, state) => )
這樣設定之後,每次分發乙個action,都會自動執行這個函式。

從 3.1.0 起,subscribeaction也可以指定訂閱處理函式的被呼叫時機應該在乙個 action 分發之前還是之後 (預設行為是之前):

store.subscribeaction(`)

},after: (action, state) => `)

}})

現在先看看這個api的原始碼:

subscribeaction (fn)  : fn

return genericsubscribe(subs, this._actionsubscribers)

}function genericsubscribe (fn, subs)

return () =>

}}

**很簡單,總的來說,就是將我們配置的物件/函式放到_actionsubscribers陣列中。

然後再來看看dispatch這個方法:

dispatch (_type, _payload)  = unifyobjectstyle(_type, _payload)

const action =

const entry = this._actions[type]

if (!entry) `)

}return

}try catch (e)

}const result = entry.length > 1

? promise.all(entry.map(handler => handler(payload)))

: entry[0](payload)

return result.then(res => catch (e)

}return res

})}

總體上來說,就是先把_actionsubscribers陣列中的before的函式都執行完之後,在分發action對應的型別。執行完畢之後在執行_actionsubscribers陣列after配置的方法。值得注意的是,分發action的時候採用了promise。所以比較適合在action裡面執行非同步函式。

iOS多執行緒 dispatch源

dispatch源 dispatch source 和runloop源概念上有些類似的地方,而且使用起來更簡單。要很好地理解dispatch源,其實把它看成一種特別的生產消費模式。dispatch源好比生產的資料,當有新資料時,會自動在dispatch指定的佇列 即消費佇列 上執行相應地block,...

ConcurrentHashMap的原始碼分析

put final v putval k key,v value,boolean onlyifabsent 在上一步的else if中 f 不為null時,則判斷f的hash值是否為moved,即 1,如果為 1,表示正在擴容 else if fh f.hash moved 協助資料遷移 tab h...

DispatcherServlet的原始碼和流程分析

1 自動配置dispatcherservlet和dispatcherservletregistry 2 註冊dispatcherservlet到servletcontext 3 初始化mvc的元件 handler執行完成後,向dispatcherservlet 返回乙個modelandview物件 ...