"Движок" XMLHttpRequest запросов
Добрый день, отправить и принять get запрос проблем нету, но проблемы возникли в синхронизации запросов, когда происходит периодический запрос по таймеру и необходимо отравить запрос по callback из кнопки.
Бывает такие запросы накладываются друг на друга (отправляются максимально близко друг к другу) и сервер выполненный на stm32 не успевает один из запросов обработать, поэтому происходит сбои. Первое что приходит на ум сделать буфер туда из всех обработчиков класть запросы на выполнение а он с периодом 100ms будет отправлять их. Запустить это думаю в таймере как раз таки по 100ms и после добавления запроса в буфер как-то пингануть таймер что бы он 100ms не ждал для одиночных запросов. Есть еще какие либо методы устранения данной проблемы? |
Обычная очередь. Что-то типа такого:
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. |