Имеется
SPA приложение с чатом (система диалогов с привязкой к определенной статье). В главном шаблоне MainApp вызывается действие,
инициализирующее начальные данные чата (статьи пользователя и имеются ли
непрочитанные сообщения к
данной статье):
created() {
this.$store.dispatch('chat/InitChatSystem');
},
Инициализирующее действие:
InitChatSystem() {
axios.get('/api/initChat')
.then(res => {
this.commit('chat/initArticles', res.data.articles);
this.commit('chat/initNotifications', res.data.notifications);
})
.catch(err => {
console.log(err);
})
},
Мутация действия:
initArticles(state, data) {
for (let i = 0, len = data.length; i < len; i++) {
state.articles.push(data[i]);
}
},
На странице с чатом (keep-alive) вызывается мутация:
activated() {
this.$store.commit('chat/openConversationArticle', this.article_id);
},
Мутация:
openConversationArticle(state, article_id) {
....
//Ищется статья, чтобы пометить все сообщения как прочитанные
let notification_ids = [];
let article_index = state.articles.findIndex(x => +x.id === +article_id);
console.log(article_index); //Всегда -1 (т.е. не найдено)
state.articles[article_index].notification = false;
state.articles[article_index].notification_count = 0;
if (notification_ids.length > 0) {
axios.post('/api/markAsReadNotification', {notification_ids: notification_ids});
}
},
Если сразу открыть в браузере страницу с чатом, то появляется ошибка
Cannot set property 'notification' of undefined
в данной строке:
state.articles[article_index].notification = false
Т.е. в мутации openConversationArticle state.articles
еще не заполнены (проверял, длина массива = 0).
Как можно перед вызовом мутации проверить завершились ли другие мутации?
Пробовал в InitChatSystem сделать
return new Promise((resolve, reject) => {
...
}
А далее вот так:
openConversationArticle({ dispatch, commit }) {
return dispatch('InitChatSystem').then(() => {
commit('openConversationArticle')
})
}
Однако в таком случае:
сначала вызывается действие
InitChatSystem в главном шаблоне, потом еще раз это действие
dispatch('InitChatSystem') в openConversationArticle и только потом
мутация статьи.