vuex中為什么把把異步操作封裝在action,把同步操作放在mutations答捕?
官方文檔說(shuō)明:“在 mutation 中混合異步調(diào)用會(huì)導(dǎo)致你的程序很難調(diào)試逝钥。例如,當(dāng)你能調(diào)用了兩個(gè)包含異步回調(diào)的 mutation 來(lái)改變狀態(tài)拱镐,你怎么知道什么時(shí)候回調(diào)和哪個(gè)先回調(diào)呢艘款?這就是為什么我們要區(qū)分這兩個(gè)概念。在 Vuex 中沃琅,我們將全部的改變都用同步方式實(shí)現(xiàn)哗咆。我們將全部的異步操作都放在Actions中∫婷迹”
但我不明白的是晌柬,我如果同時(shí)出發(fā)了兩個(gè)異步的actions,那么這兩個(gè)回調(diào)的時(shí)間不一樣呜叫,那么對(duì)于state的更新還是存在競(jìng)態(tài)的空繁。所以我覺(jué)得這樣進(jìn)行區(qū)分并不能解決“那么先回調(diào)殿衰,哪個(gè)后回調(diào)”來(lái)更新state的問(wèn)題朱庆。
作者回答
區(qū)分: actions 和 mutations 并不是為了解決競(jìng)態(tài)問(wèn)題,而是為了能用 devtools 追蹤狀態(tài)變化闷祥。事實(shí)上在 vuex 里面 actions 只是一個(gè)架構(gòu)性的概念娱颊,并不是必須的,說(shuō)到底只是一個(gè)函數(shù)凯砍,你在里面想干嘛都可以箱硕,只要最后觸發(fā) mutation 就行。異步競(jìng)態(tài)怎么處理那是用戶自己的事情悟衩。vuex 真正限制你的只有 mutation 必須是同步的這一點(diǎn)(在 redux 里面就好像 reducer 必須同步返回下一個(gè)狀態(tài)一樣)剧罩。同步的意義在于這樣每一個(gè) mutation 執(zhí)行完成后都可以對(duì)應(yīng)到一個(gè)新的狀態(tài)(和 reducer 一樣),這樣 devtools 就可以打個(gè) snapshot 存下來(lái)座泳,然后就可以隨便 time-travel 了惠昔。如果你開(kāi)著 devtool 調(diào)用一個(gè)異步的 action幕与,你可以清楚地看到它所調(diào)用的 mutation 是何時(shí)被記錄下來(lái)的,并且可以立刻查看它們對(duì)應(yīng)的狀態(tài)镇防。其實(shí)我有個(gè)點(diǎn)子一直沒(méi)時(shí)間做啦鸣,那就是把記錄下來(lái)的 mutations 做成類似 rx-marble 那樣的時(shí)間線圖,對(duì)于理解應(yīng)用的異步狀態(tài)變化很有幫助来氧。