Я использовал способ, описанный в Оптимистичных автономных первых приложениях с Vuex , чтобы сохранить мой экземпляр Vuex среди перезагрузок.Я скопировал соответствующие части здесь.
Однако есть одна проблема.Похоже, что между подключением компонентов и применением кэшированного хранилища существует условие гонки.
const store = new Vuex.Store({
state: {
initialized: false,
},
mutations: {
loadFromCache(state, cached) {
if (cached) {
Object.keys(cached).forEach((key) => {
state[key] = Object.assign({}, state[key], cached[key]);
});
}
state.initialized = true;
},
}
});
function startLoadFromCache() {
if (store.initialized) {
return Promise.resolve();
}
return getState()
.then(state => store.commit('loadFromCache', state));
}
startLoadFromCache();
new Vue({
el: '#app',
components: { App },
template: '<App/>',
store
});
Поскольку getState()
возвращает обещание, мутация не фиксируется синхронно.Так как же мне:
- заблокировать выполнение до тех пор, пока хранилище не будет полностью инициализировано
- обнаружить, что хранилище не инициализировано, и, возможно, покажет спиннер?