詳解vuex中action何時完成以及如何正確調用dispatch的思考
在項目中遇到關于action與dispatch使用的一些細節(jié)問題,經(jīng)過搜索得到了一些答案。
特意在此提出,如有錯誤還請指出,十分感謝~
問題1:如果action是異步的,那么怎么知道它什么時候完成?在vuex的官網(wǎng)給出了答案:

注:如果需要通過組合多個action來完成某些邏輯,用async/await會更簡單一點
問題2: 如果action是同步的,就不需要等待它完成了嗎?
其實這個問題相當于在w:dispatch('some action')是一個同步函數(shù)還是異步函數(shù)。
如果dispatch是一個異步函數(shù)(返回一個promise),那么即使action里面的邏輯是同步的,如果需要等待這個action完成之后才進行某些操作,仍然是需要用異步等待dispatch().then(()=> {})來實現(xiàn)
通過查看vuex的源碼找到了答案:
dispatch (_type, _payload) {
// check object-style dispatch
const {
type,
payload
} = unifyObjectStyle(_type, _payload)
const action = { type, payload }
const entry = this._actions[type]
if (!entry) {
if (process.env.NODE_ENV !== 'production') {
console.error(`[vuex] unknown action type: ${type}`)
}
return
}
try {
this._actionSubscribers
.filter(sub => sub.before)
.forEach(sub => sub.before(action, this.state))
} catch (e) {
if (process.env.NODE_ENV !== 'production') {
console.warn(`[vuex] error in before action subscribers: `)
console.error(e)
}
}
const result = entry.length > 1
? Promise.all(entry.map(handler => handler(payload)))
: entry[0](payload)
return result.then(res => {
try {
this._actionSubscribers
.filter(sub => sub.after)
.forEach(sub => sub.after(action, this.state))
} catch (e) {
if (process.env.NODE_ENV !== 'production') {
console.warn(`[vuex] error in after action subscribers: `)
console.error(e)
}
}
return res
})
}
dispatch函數(shù)返回的是一個promise,所以dispatch后如果需要跟進操作(比如dispatch里面commit了一個state,后續(xù)要用到這個state),正確的做法應該是需要用異步的方式來完成后續(xù)的邏輯
注:用同步的寫法看起來好像state也是對的,但可能只是恰好我的業(yè)務場景io使用不是很高所以"看起來是對的",嚴謹?shù)淖龇☉撨€是需要用異步來完成后續(xù)操作的
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Vue SPA單頁應用首屏優(yōu)化實踐
- 詳解vue之自行實現(xiàn)派發(fā)與廣播(dispatch與broadcast)
- Vue實現(xiàn)boradcast和dispatch的示例
- vue-cli單頁面預渲染seo-prerender-spa-plugin操作
- vuex中store存儲store.commit和store.dispatch的用法
- Vue SPA 初次進入加載動畫實現(xiàn)代碼
- Vue實現(xiàn)數(shù)據(jù)表格合并列rowspan效果
- vue spa應用中的路由緩存問題與解決方案
- 解決Vue+Electron下Vuex的Dispatch沒有效果問題
- VUE解決微信簽名及SPA微信invalid signature問題(完美處理)
- Vue SPA 首屏優(yōu)化方案
相關文章
Vue3異步數(shù)據(jù)加載組件suspense的使用方法
前端開發(fā)中異步請求是非常常見的事情,比如遠程讀取圖片,調用后端接口等等,這篇文章主要給大家介紹了關于Vue3異步數(shù)據(jù)加載組件suspense的使用方法,suspense中文含義是懸念的意思,需要的朋友可以參考下2021-08-08
vue采用EventBus實現(xiàn)跨組件通信及注意事項小結
EventBus是一種發(fā)布/訂閱事件設計模式的實踐。這篇文章主要介紹了vue采用EventBus實現(xiàn)跨組件通信及注意事項,需要的朋友可以參考下2018-06-06
vue-draggable實現(xiàn)拖拽表單的示例代碼
本文主要介紹了vue-draggable實現(xiàn)拖拽表單的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05
vue2.0實現(xiàn)倒計時的插件(時間戳 刷新 跳轉 都不影響)
我發(fā)現(xiàn)好多倒計時的插件,刷新都會變成從頭再來,于是自己用vue2.0寫了一個,感覺還不錯,特此分享到腳本之家平臺供大家參考下2017-03-03

