Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   "Движок" XMLHttpRequest запросов (https://javascript.ru/forum/misc/83738-dvizhok-xmlhttprequest-zaprosov.html)

pokk 28.02.2022 06:18

"Движок" XMLHttpRequest запросов
 
Добрый день, отправить и принять get запрос проблем нету, но проблемы возникли в синхронизации запросов, когда происходит периодический запрос по таймеру и необходимо отравить запрос по callback из кнопки.
Бывает такие запросы накладываются друг на друга (отправляются максимально близко друг к другу) и сервер выполненный на stm32 не успевает один из запросов обработать, поэтому происходит сбои.

Первое что приходит на ум сделать буфер туда из всех обработчиков класть запросы на выполнение а он с периодом 100ms будет отправлять их. Запустить это думаю в таймере как раз таки по 100ms и после добавления запроса в буфер как-то пингануть таймер что бы он 100ms не ждал для одиночных запросов.

Есть еще какие либо методы устранения данной проблемы?

Aetae 28.02.2022 07:00

Обычная очередь. Что-то типа такого:
function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

class AsyncQueue { 
  queue = [];
  interval = 100;
  asyncFunction = fetch;
  
  constructor(options) {
    Object.assign(this, options);
    this.execute.bind(this);
  }
  
  execute(...args) {
    let params;
    const promise = new Promise((resolve, reject) => params = {
      args,
      resolve,
      reject
    });
    
    this.queue.push(params);
    
    if(this.queue.length === 1)
      this.stream();
    
    return promise;
  }
  
  async stream() {
    for (const { args, resolve, reject } of this.queue) {
      await this.asyncFunction(...args).then(resolve, reject);
      await delay(this.interval);
    }
    this.queue.length = 0;
  }
}

const queue = new AsyncQueue({
  asyncFunction(...fetchOptions) {
    return fetch(...fetchOptions).then(response => {
      if(!response.ok) throw new Error(response.status);
      return response.text();
    })
  }
});
  
queue.execute('/1').then(console.log, console.warn)
queue.execute('/2').then(console.log, console.warn)
queue.execute('/3').then(console.log, console.warn)

asyncFunction - тут fetch, но может быть любой возращающей Promise в том числе на основе XMLHttpRequest.
Можно то же самое и без class, Promise и await написать, на колбэках, но мне лениво.)


Часовой пояс GMT +3, время: 09:26.