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

注:如果需要通過組合多個(gè)action來完成某些邏輯,用async/await會(huì)更簡(jiǎn)單一點(diǎn)
問題2: 如果action是同步的,就不需要等待它完成了嗎?
其實(shí)這個(gè)問題相當(dāng)于在w:dispatch('some action')是一個(gè)同步函數(shù)還是異步函數(shù)。
如果dispatch是一個(gè)異步函數(shù)(返回一個(gè)promise),那么即使action里面的邏輯是同步的,如果需要等待這個(gè)action完成之后才進(jìn)行某些操作,仍然是需要用異步等待dispatch().then(()=> {})來實(shí)現(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ù)返回的是一個(gè)promise,所以dispatch后如果需要跟進(jìn)操作(比如dispatch里面commit了一個(gè)state,后續(xù)要用到這個(gè)state),正確的做法應(yīng)該是需要用異步的方式來完成后續(xù)的邏輯
注:用同步的寫法看起來好像state也是對(duì)的,但可能只是恰好我的業(yè)務(wù)場(chǎng)景io使用不是很高所以"看起來是對(duì)的",嚴(yán)謹(jǐn)?shù)淖龇☉?yīng)該還是需要用異步來完成后續(xù)操作的
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Vue SPA單頁(yè)應(yīng)用首屏優(yōu)化實(shí)踐
- 詳解vue之自行實(shí)現(xiàn)派發(fā)與廣播(dispatch與broadcast)
- Vue實(shí)現(xiàn)boradcast和dispatch的示例
- vue-cli單頁(yè)面預(yù)渲染seo-prerender-spa-plugin操作
- vuex中store存儲(chǔ)store.commit和store.dispatch的用法
- Vue SPA 初次進(jìn)入加載動(dòng)畫實(shí)現(xiàn)代碼
- Vue實(shí)現(xiàn)數(shù)據(jù)表格合并列rowspan效果
- vue spa應(yīng)用中的路由緩存問題與解決方案
- 解決Vue+Electron下Vuex的Dispatch沒有效果問題
- VUE解決微信簽名及SPA微信invalid signature問題(完美處理)
- Vue SPA 首屏優(yōu)化方案
相關(guān)文章
Vue3異步數(shù)據(jù)加載組件suspense的使用方法
前端開發(fā)中異步請(qǐng)求是非常常見的事情,比如遠(yuǎn)程讀取圖片,調(diào)用后端接口等等,這篇文章主要給大家介紹了關(guān)于Vue3異步數(shù)據(jù)加載組件suspense的使用方法,suspense中文含義是懸念的意思,需要的朋友可以參考下2021-08-08
vue采用EventBus實(shí)現(xiàn)跨組件通信及注意事項(xiàng)小結(jié)
EventBus是一種發(fā)布/訂閱事件設(shè)計(jì)模式的實(shí)踐。這篇文章主要介紹了vue采用EventBus實(shí)現(xiàn)跨組件通信及注意事項(xiàng),需要的朋友可以參考下2018-06-06
vue請(qǐng)求后端數(shù)據(jù)和跨域問題解決
這篇文章主要介紹了vue請(qǐng)求后端數(shù)據(jù)和跨域問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
vue項(xiàng)目在IE瀏覽器下運(yùn)行空白問題及解決
IE11瀏覽器無法解析ES6語(yǔ)法導(dǎo)致Vue項(xiàng)目在IE11下顯示空白,解決方法包括安裝babel-polyfill,并在項(xiàng)目的main.js文件中引入babel-polyfill,此外,js-base64版本3及以上不兼容IE11,解決辦法是使用版本3以下的js-base64,這些措施可以幫助兼容IE11,確保項(xiàng)目正常運(yùn)行2024-09-09
vue-draggable實(shí)現(xiàn)拖拽表單的示例代碼
本文主要介紹了vue-draggable實(shí)現(xiàn)拖拽表單的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
vue2.0實(shí)現(xiàn)倒計(jì)時(shí)的插件(時(shí)間戳 刷新 跳轉(zhuǎn) 都不影響)
我發(fā)現(xiàn)好多倒計(jì)時(shí)的插件,刷新都會(huì)變成從頭再來,于是自己用vue2.0寫了一個(gè),感覺還不錯(cuò),特此分享到腳本之家平臺(tái)供大家參考下2017-03-03
Vue利用canvas實(shí)現(xiàn)移動(dòng)端手寫板的方法
本篇文章主要介紹了Vue利用canvas實(shí)現(xiàn)移動(dòng)端手寫板的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
iview+vue實(shí)現(xiàn)導(dǎo)入EXCEL預(yù)覽功能
這篇文章主要為大家詳細(xì)介紹了iview+vue實(shí)現(xiàn)導(dǎo)入EXCEL預(yù)覽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07

