#vue.js #axios #vuex #cancellation
Вопрос:
У меня есть ситуация: когда я живу на странице, асинхронные функции в mounted
hook продолжают работать (например await this.getUser({id: 1})
). Я пытаюсь использовать axios.CancelToken
, но, к сожалению, он отменяет только первый запрос (не все запрошенные). Функция отправки запроса:
const source = axios.CancelToken.source();
const config = {
headers: {
authorization: `${prefix}${localStorage.getItem('authorization')}`
},
cancelToken: source.token
};
store.commit('SET_CANCEL_SOURCE', source);
const response = await axios.get(url, config);
Храните мутации:
SET_CANCEL_SOURCE: (state, cancel: CancelTokenSource) => {
state.cancelTokens.push(cancel);
},
RESET_CANCEL_TOKENS: (state) => {
if (state.cancelTokens.length) {
state.cancelTokens.map((item: any, index: number) => {
console.log(index, item);
item.cancel();
});
state.cancelTokens = [];
}
}
Действие магазина:
clearToken ({commit}) {
commit('RESET_CANCEL_TOKENS');
}
И перед установкой для компонента:
beforeUnmount() {
this.clearToken();
}
Есть какие-нибудь идеи?
Комментарии:
1.Основываясь на документации, похоже, что для каждого запроса создается новый токен. Возможно, вам нужно использовать Вы также можете создать токен отмены, передав функцию исполнителя
CancelToken
axios-http.com/docs/cancellation2. @Patfreeze при подобных действиях — также отменяется только первый запрос
3. Мы видим только один запрос в вашем посте, который нужно добавить
config
к каждому запросу. Попробуйте сделать свои запросы на одной странице без использованияvuex
и посмотрите, будет ли отменена только первая.4. Я понял причину: он отменяет запросы, уже добавленные в стек запросов, но у меня есть ожидание в смонтированном, так что некоторые запросы вызываются после того, как другие заполнены. И эти запросы не отменяются
5. Хорошо, если вы нашли решение, ОПУБЛИКУЙТЕ его здесь в качестве ответа.
Ответ №1:
Дело в том, что CancelToken
отменяются только те запросы, которые уже отправлены. Лучшее решение, которое я нашел, — это сделать этапы загрузки информации, создать переменную, представляющую текущий этап, и beforeUnmount
создать переменную isCancelled = true
. Так что следующие этапы не будут отменены. Пример:
data: () => ({
stage: 0,
isCancelled: false,
}),
async setInitialData() {
if (this.stage >= 4 || this.isCancelled) {
return;
}
switch (this.stage) {
case 0:
await action1();
break;
case 1:
await action2();
break;
case 2:
await action3();
break;
case 3:
await action2();
break;
default:
break;
}
this.stage ;
await this.setInitialData();
},
async mounted() {
await this.setInitialData();
},
beforeUnmount() {
this.isCancelled = true;
},