詳解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ì)更簡單一點(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ù)場景io使用不是很高所以"看起來是對(duì)的",嚴(yán)謹(jǐn)?shù)淖龇☉?yīng)該還是需要用異步來完成后續(xù)操作的
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Vue SPA單頁應(yīng)用首屏優(yōu)化實(shí)踐
- 詳解vue之自行實(shí)現(xiàn)派發(fā)與廣播(dispatch與broadcast)
- Vue實(shí)現(xiàn)boradcast和dispatch的示例
- vue-cli單頁面預(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)文章
Vue+Bootstrap收藏(點(diǎn)贊)功能邏輯與具體實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Vue+Bootstrap收藏(點(diǎn)贊)功能邏輯與具體實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10vue自定義樹狀結(jié)構(gòu)圖的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于vue自定義樹狀結(jié)構(gòu)圖的實(shí)現(xiàn)方法,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10vue自定義指令和動(dòng)態(tài)路由實(shí)現(xiàn)權(quán)限控制
這篇文章主要介紹了vue自定義指令和動(dòng)態(tài)路由實(shí)現(xiàn)權(quán)限控制的方法,幫助大家更好的理解和學(xué)習(xí)vue,感興趣的朋友可以了解下2020-08-08vue-element-admin搭建后臺(tái)管理系統(tǒng)的實(shí)現(xiàn)步驟
本文主要介紹了vue-element-admin搭建后臺(tái)管理系統(tǒng)的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10詳解Vue3?SFC?和?TSX?方式調(diào)用子組件中的函數(shù)
在使用?.vue?定義的組件中,setup?中提供了?defineExpose()?方法,該方法可以將組件內(nèi)部的方法暴露給父組件,這篇文章主要介紹了Vue3?SFC?和?TSX?方式調(diào)用子組件中的函數(shù),需要的朋友可以參考下2022-10-10vue使用showdown并實(shí)現(xiàn)代碼區(qū)域高亮的示例代碼
這篇文章主要介紹了vue使用showdown并實(shí)現(xiàn)代碼區(qū)域高亮的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10