you_are_enot
@you_are_enot
Пограммист любитель

Как улучшить упаковку запросов?

Я пытаюсь реализовать функцию для упаковки запросов. Суть её работы заключается в сборе запросов в пачку по 25 шт и отправки с интервалом в 50мс. После выполнения, ответ должен вернуться в функцию, которая отправила запрос.

Я новичок в javascript, было бы полезно слышать критику от продвинутых разработчиков.

// Пример вызова функции
await vk("get.user", { user_id: 1 });


При вызове функции, она оборачивается в промис и объект с параметрами, resolve и reject помещаются в массив.

let queue = [];

function vk(method, data = {}) {
        return new Promise((resolve, reject) => {
            const query = `API.${method}(${JSON.stringify(data)})`;
            queue.push({ resolve, reject, query });
        });
};


Вторая функция каждые 50мс извлекает из массива первые 25 вызовов, упаковывает и делает запрос. После, ответа пробегается в массиве и вызывается resolve() вызвавшей функции с результатом запроса.

setTimeout(async function execute() {
    const queuePart = queue.splice(0, 25);

    if (queuePart.length !== 0) {
        const code = `return [${queuePart.reduce((chunk, { query }) => `${chunk}${query},`, "")}];`;
        const response = await request(code);

        for (let i = 0, len = response.length; i < len; i++) {
            const { resolve } = queuePart[i];
            resolve(response[i][0]);
        };
    };
    setTimeout(execute, 50);
}, 50);
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
@StockholmSyndrome
resolve(response[i][0]);

зачем [0]? упаковка запросов может использоваться для любых методов, где структура ответа может быть не массивом

можно добавить обработку ошибок
если в ответе false, то метод вернул ошибку, которая помещается в массив объектов execute_errors, то есть можно написать что-то такое:
const { response, execute_errors } = await request(code);

for (let i = 0, len = response.length; i < len; i++) {
  const { resolve, reject } = queuePart[i];
  if (response[i] === false) {
    reject(execute_errors.shift());
  } else {
    resolve(response[i]);
  }
};

но при этом request должен возвращать полный ответ от метода execute, а не только поле response
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы