Vuex的mutation中不能做異步操作的原因是因?yàn)閙utation必須是同步函數(shù)。這是因?yàn)閂uex的設(shè)計(jì)原則是通過mutation來改變狀態(tài),而狀態(tài)改變后,視圖會(huì)立即更新。如果mutation中是異步操作,那么當(dāng)狀態(tài)改變時(shí),視圖可能還沒有更新完成,這會(huì)導(dǎo)致視圖和狀態(tài)不一致的情況。
另外,如果mutation中進(jìn)行異步操作,那么就無法保證狀態(tài)的改變是按照預(yù)期的順序執(zhí)行的,這可能會(huì)導(dǎo)致一些難以預(yù)料的問題。
如果需要進(jìn)行異步操作,可以在action中進(jìn)行。action可以包含任意異步操作,當(dāng)異步操作完成后,再通過調(diào)用mutation來改變狀態(tài)。這樣可以保證狀態(tài)的改變是按照預(yù)期的順序執(zhí)行的,同時(shí)也保證了視圖和狀態(tài)的一致性。
除了保證狀態(tài)改變的一致性和可預(yù)測(cè)性,Vuex要求mutation必須是同步函數(shù)還有另一個(gè)重要的原因,那就是為了確保devtools中的時(shí)間旅行功能可以正常使用。
當(dāng)你在開發(fā)過程中使用Vuex,你可能會(huì)使用Vue Devtools插件來幫助調(diào)試你的應(yīng)用。這個(gè)插件有一個(gè)非常有用的特性,那就是時(shí)間旅行。你可以記錄應(yīng)用的狀態(tài)改變,然后隨時(shí)回滾到某個(gè)特定的狀態(tài)。
但是,這個(gè)特性只適用于同步的mutation。如果mutation是異步的,那么當(dāng)狀態(tài)改變時(shí),devtools可能無法準(zhǔn)確地捕獲到這個(gè)改變,因此也就無法進(jìn)行時(shí)間旅行。
所以,總的來說,Vuex要求mutation必須是同步函數(shù)是為了保證狀態(tài)改變的一致性和可預(yù)測(cè)性,以及確保devtools中的時(shí)間旅行功能可以正常使用。如果你需要進(jìn)行異步操作,那么應(yīng)該使用action來進(jìn)行。