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

注:如果需要通過組合多個action來完成某些邏輯,用async/await會更簡單一點
問題2: 如果action是同步的,就不需要等待它完成了嗎?
其實這個問題相當(dāng)于在w:dispatch('some action')是一個同步函數(shù)還是異步函數(shù)。
如果dispatch是一個異步函數(shù)(返回一個promise),那么即使action里面的邏輯是同步的,如果需要等待這個action完成之后才進(jìn)行某些操作,仍然是需要用異步等待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后如果需要跟進(jìn)操作(比如dispatch里面commit了一個state,后續(xù)要用到這個state),正確的做法應(yīng)該是需要用異步的方式來完成后續(xù)的邏輯
注:用同步的寫法看起來好像state也是對的,但可能只是恰好我的業(yè)務(wù)場景io使用不是很高所以"看起來是對的",嚴(yán)謹(jǐn)?shù)淖龇☉?yīng)該還是需要用異步來完成后續(xù)操作的
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Vue SPA單頁應(yīng)用首屏優(yōu)化實踐
- 詳解vue之自行實現(xiàn)派發(fā)與廣播(dispatch與broadcast)
- Vue實現(xiàn)boradcast和dispatch的示例
- vue-cli單頁面預(yù)渲染seo-prerender-spa-plugin操作
- vuex中store存儲store.commit和store.dispatch的用法
- Vue SPA 初次進(jìn)入加載動畫實現(xiàn)代碼
- Vue實現(xiàn)數(shù)據(jù)表格合并列rowspan效果
- vue spa應(yīng)用中的路由緩存問題與解決方案
- 解決Vue+Electron下Vuex的Dispatch沒有效果問題
- VUE解決微信簽名及SPA微信invalid signature問題(完美處理)
- Vue SPA 首屏優(yōu)化方案
相關(guān)文章
Vue+Bootstrap收藏(點贊)功能邏輯與具體實現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Vue+Bootstrap收藏(點贊)功能邏輯與具體實現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-10-10
vue自定義樹狀結(jié)構(gòu)圖的實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于vue自定義樹狀結(jié)構(gòu)圖的實現(xiàn)方法,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
vue自定義指令和動態(tài)路由實現(xiàn)權(quán)限控制
這篇文章主要介紹了vue自定義指令和動態(tài)路由實現(xiàn)權(quán)限控制的方法,幫助大家更好的理解和學(xué)習(xí)vue,感興趣的朋友可以了解下2020-08-08
vue-element-admin搭建后臺管理系統(tǒng)的實現(xiàn)步驟
本文主要介紹了vue-element-admin搭建后臺管理系統(tǒng)的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
詳解Vue3?SFC?和?TSX?方式調(diào)用子組件中的函數(shù)
在使用?.vue?定義的組件中,setup?中提供了?defineExpose()?方法,該方法可以將組件內(nèi)部的方法暴露給父組件,這篇文章主要介紹了Vue3?SFC?和?TSX?方式調(diào)用子組件中的函數(shù),需要的朋友可以參考下2022-10-10
vue使用showdown并實現(xiàn)代碼區(qū)域高亮的示例代碼
這篇文章主要介紹了vue使用showdown并實現(xiàn)代碼區(qū)域高亮的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10

