@aheles

Vue+js как сделать чтобы axios выполнялся поочередно?

Есть функция, которая отправляет axios:
getSchedules(locationId, gameModeId, selectedHeadsets, day) {

                let param = 'locationId=' + locationId + '&gameModeId=' + gameModeId + '&headsets=' + selectedHeadsets

                if (day)
                    param += '&day=' + day;

                return axios({
                    method: 'get',
                    url: 'schedules?' + param
                }).then((response) => {


                    if(this.curDateEvent){
                        this.changeMobileDay(this.curDateEvent);
                    }

                }).catch((error) => {

                });
            }


Проблема в том, что если пользователь много раз отправил запрос, то ему возвращаются данные которые прогружаются не поочередно, например, человек отправил 5 запросов сразу, но например последний запрос загрузится быстрее, чем четвертый запрос. Как сделать поочередность запросов?
Погуглил, узнал про async await, но так и не смог подставить это в функцию
Сам пример вызова этой функции:
this.getSchedules(this.selectedLocationId, this.selectedGameModeId, this.selectedHeadsets,day).then(()=>{
document.getElementById('stepView4').scrollIntoView({behavior:'smooth'});
});
  • Вопрос задан
  • 237 просмотров
Решения вопроса 1
Aetae
@Aetae Куратор тега Vue.js
Тлен
Если это именно то, чего ты хочешь, то ты можешь сделать себе очередь, условно так:
class AsyncQueue {
  constructor(result) {
    this.queue = [];
    this.result = result;
  }
  isStreaming = false;
  add(promise) {
    this.queue.push(promise);
    if(!this.isStreaming)
      this.stream();
  }
  async stream() {
    this.isStreaming = true;
    for await (const result of this.queue) {
      this.result(result);
    }
    this.queue.length = 0;
    this.isStreaming = false;
  }
}

Vue:
data() {
  const schedulesQueue = new AsyncQueue(this.showLoadedSchedules);
  return {
    schedulesQueue,
    // ...
  }
},

methods: {
  showLoadedSchedules(response) {
    if(this.curDateEvent) {
      this.changeMobileDay(this.curDateEvent);
    }
    // ...
  },
  addSchedulesToQueue(locationId, gameModeId, selectedHeadsets, day) {
    let param = 'locationId=' + locationId + '&gameModeId=' + gameModeId + '&headsets=' + selectedHeadsets

    if (day)
      param += '&day=' + day;

    return this.schedulesQueue.add(
      axios({
        method: 'get',
        url: 'schedules?' + param
      }).catch((error) => {})
    );
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы