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物件 ...