Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.02.2022, 06:18
Кандидат Javascript-наук
Отправить личное сообщение для pokk Посмотреть профиль Найти все сообщения от pokk
 
Регистрация: 30.01.2014
Сообщений: 145

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

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

Есть еще какие либо методы устранения данной проблемы?
Ответить с цитированием
  #2 (permalink)  
Старый 28.02.2022, 07:00
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,577

Обычная очередь. Что-то типа такого:
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 написать, на колбэках, но мне лениво.)
__________________
29375, 35

Последний раз редактировалось Aetae, 28.02.2022 в 07:47.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
XMLHttpRequest передача массива серверу JaneLane AJAX и COMET 5 16.05.2014 12:09
запрос на другой сайт XMLHttpRequest vscorpion Internet Explorer 9 24.12.2013 16:46
xmlHttpRequest подскажите czp AJAX и COMET 4 10.12.2012 23:23
XMLHTTPRequest дождаться выполнения всех асинхронных запросов false Javascript под браузер 10 13.05.2012 15:57
Очередь XML запросов Евгений М AJAX и COMET 4 01.02.2012 11:05