Освоение очереди обещаний по времени и регулирование в JavaScript

В этой статье блога мы рассмотрим концепции временной очереди обещаний и регулирования в JavaScript. Эти методы невероятно полезны, когда речь идет об управлении асинхронными операциями и контроле скорости выполнения определенных действий. Мы углубимся в детали каждого метода, предоставим примеры кода и обсудим их практическое применение. Итак, начнём!

Очередь обещаний по времени.
Очередь обещаний по времени — это механизм, который позволяет вам контролировать выполнение асинхронных задач путем добавления задержки между каждой задачей. Это может быть полезно в сценариях, когда вы хотите ограничить количество одновременных операций или ввести паузу между каждой задачей, чтобы не перегружать систему.

Вот пример реализации очереди обещаний по времени с использованием setTimeoutи Promise:

class TimedPromiseQueue {
  constructor(delay) {
    this.delay = delay;
    this.queue = [];
    this.running = false;
  }
  add(task) {
    return new Promise((resolve, reject) => {
      this.queue.push({ task, resolve, reject });
      if (!this.running) {
        this.run();
      }
    });
  }
  async run() {
    this.running = true;
    while (this.queue.length > 0) {
      const { task, resolve, reject } = this.queue.shift();
      try {
        const result = await task();
        resolve(result);
      } catch (error) {
        reject(error);
      }
      await new Promise(resolve => setTimeout(resolve, this.delay));
    }
    this.running = false;
  }
}
// Usage example
const queue = new TimedPromiseQueue(1000); // 1-second delay between tasks
function asyncTask() {
  return new Promise(resolve => {
    setTimeout(() => {
      const result = 'Task completed';
      resolve(result);
    }, 500);
  });
}
queue.add(asyncTask)
  .then(result => {
    console.log(result); // Task completed
  })
  .catch(error => {
    console.error(error);
  });

В приведенном выше примере мы создаем класс TimedPromiseQueue, который позволяет нам добавлять задачи в очередь с помощью метода add. Каждая задача заключена в промис, и очередь обрабатывается по одной задаче за раз с задержкой между каждым выполнением.

Регулирование.
Регулирование — это метод, ограничивающий частоту вызова функции. Это полезно, если вы хотите контролировать скорость выполнения определенных действий, таких как запросы API или обработка событий.

Вот пример реализации функции регулирования с использованием setTimeout:

function throttle(func, delay) {
  let timeout;
  return function (...args) {
    if (!timeout) {
      timeout = setTimeout(() => {
        func.apply(this, args);
        timeout = null;
      }, delay);
    }
  };
}
// Usage example
function expensiveOperation() {
  console.log('Performing expensive operation...');
}
const throttledOperation = throttle(expensiveOperation, 1000); // Limit to one invocation per second
throttledOperation(); // Performing expensive operation...
throttledOperation(); // Ignored (throttled)

В приведенном выше примере функция throttleпринимает в качестве аргументов функцию funcи задержку delay. Он возвращает новую функцию, которую можно вызвать, но ее выполнение регулируется в зависимости от указанной задержки. Последующие вызовы в течение периода задержки игнорируются.

В этой статье мы рассмотрели два мощных метода в JavaScript: очереди обещаний по времени и регулирование. Очередь обещаний по времени позволяет нам контролировать выполнение асинхронных задач, вводя задержку между каждой задачей. С другой стороны, регулирование ограничивает частоту вызова функции. Понимая и используя эти методы, вы сможете повысить эффективность и производительность своих приложений JavaScript.