Прервать все запросы Axios при изменении маршрута использовать vue-router

как я могу прервать / отменить запрос Axios до его завершения, когда я изменяю использование маршрута vue-router.

когда пользователь открывает страницу, он автоматически отправляет запрос axios для получения некоторых данных, но пользователь не ждет ответа, тогда он меняет маршрут с помощью vue-router будет много запросов Axios

Так есть ли решение моей проблемы?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
0
14 806
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В основном вам нужно сгенерировать глобальный токен отмены

const CancelToken = axios.CancelToken;
const source = CancelToken.source();

и используйте его во всех своих запросах, передав его в параметре конфигурации

GET запрос:

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function(thrown) {
  if (axios.isCancel(thrown)) {
    console.info('Request canceled', thrown.message);
  } else {
    // handle error
  }
});

POST запрос:

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})

Затем в навигационной защите vue-router beforeEach вы можете отменить все запросы, используя:

source.cancel('Operation canceled by the user.');

Вот официальное руководство Axios по отмене: https://github.com/axios/axios#cancellation

Ответ от @fabruex правильный. Я просто хотел добавить здесь, что если у вас много вызовов api, вам нужно передать токен отмены в каждую конфигурацию вызова api. Чтобы уменьшить этот код, вы можете создать экземпляр axios и добавить перехватчик запросов, который добавит этот общий токен отмены, а затем вы можете назначить новое значение токену, когда отмена будет выполнена или ваш маршрут изменился.

// Some global common cancel token source

let cancelSource = axios.CancelToken.source();

// Request interceptor

export const requestInterceptor = config => {
  config.cancelToken = cancelSource.token;
  return config;
};

// Add request interceptor like this
const request = axios.create({ baseURL: SOME_URL });
request.interceptors.request.use(requestInterceptor);


// Now you can use this axios instance like this

await request.get('/users');

// and

await request.post('/users', data);

// When you will cancel
cancelSource.cancel('Your cancellation message');

// And all the api calls initiated by axios instance which has request interceptor will be cancelled.

Отредактируйте, чтобы ответить @Suneet Jain

Вы можете создать класс и создать экземпляр, который вы можете обновить

class CancelToken {
  constructor(initialValue) {
    this.source = initialValue;
  }
  getSource() {
    return this.source;
  }
  setSource(value) {
    this.source = value;
  }
  cancel() {
    this.source.cancel();
  }
}
export const cancelSource = new CancelToken(axios.CancelToken.source());

Вы можете импортировать этот экземпляр cancelSource и при необходимости отменить вызов, например. когда вы выходите из системы, вы можете вызвать, чтобы отменить все запросы, у которых есть токен отмены, предоставленный cancelSource.getSource()

Итак, после выхода

cancelSource.cancel('CANCELLED');

И когда пользователь снова войдет в систему, установите новый токен отмены для этого глобального экземпляра

cancelSource.setSource(axios.CancelToken.source());

Бывают случаи, когда у нас одновременно есть несколько разных запросов. Они отменяли друг друга.

Ilyas Assainov 23.04.2020 16:20

как присвоить токену новое значение? Я не могу делать новые запросы после отмены старых.

Suneet Jain 24.08.2020 16:42

@SuneetJain Я обновил свой ответ, посмотрите. У меня это хорошо сработало в прошлом, возможно, вам придется искать все (2-4) возможных сценария, в которых вам нужно отменить или установить новый. токен отмены для этого глобального источника

Zohaib Ijaz 24.08.2020 19:28

Другие вопросы по теме