Вход

Просмотр полной версии : "Движок" XMLHttpRequest запросов


pokk
28.02.2022, 06:18
Добрый день, отправить и принять 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 написать, на колбэках, но мне лениво.)