Я всегда хотел написать супер-базовую очередь задач. У меня не было какого-то конкретного языка, на котором я хотел бы его реализовать, поэтому я просто решил использовать TypeScript.

Прежде чем мы продолжим, я просто хотел бы сказать, что следующий код неопрятен и не всегда использует типы. Например, переменная, содержащая все элементы очереди, должна иметь тип, но это обычный объект JS.

Хорошо, давайте перейдем к коду.

Очередь

Я собираюсь начать с класса Queue. Это очень просто. У него одно свойство и два метода.

Свойство содержит все задачи или «queueItems», как я его назвал. Это простой пустой объект JavaScript.

Следующая часть кода - это функция addQueueItemForTopic. Все, что для этого требуется, - это объект queueItem типа IQueueItem (мы вернемся к этому позже) и тема. Тема - это просто строка, которая будет ключом в свойстве queueItems. Параметр queueItem будет задачей, которую необходимо запустить.

Следующая функция - это processItemsForQueueTopic. Это в основном то, что написано. Он просто запускает код для каждой задачи или «queueItem», которая в данный момент находится в очереди.

class Queue
{
   queueItems = {};

   addQueueItemForTopic(queueItem: IQueueItem, topic: string)
   {
      if (this.queueItems[topic] === undefined)
      {
         this.queueItems[topic] = [queueItem];
      }
      else
      {
         this.queueItems[topic].push(queueItem);
      }
   }

   processItemsForQueueTopic(topic: string)
   {
      for (let item of queue.queueItems[topic])
      {
         item.main();
      }
      
      this.queueItems[topic] = [];
      let numberOfItemsLeft = this.queueItems[topic].length;
      
      if (numberOfItemsLeft > 0)
      {
         console.log("Number of items left in Queue for topic" + topic, this.queueItems[topic].length);
      }
      else
      {
         console.log("No more tasks for topic " + topic);
      }
   }
}

let queue = new Queue();

QueueItem

Теперь мы переходим к интерфейсу «IQueueItem».

// Interface that an item added to the queue needs to conform to
interface IQueueItem
{
   main<T>(something?:T);
}

Это то, что позволяет запускать функцию processItemsForQueueTopic. Каждый элемент, добавляемый в очередь, должен соответствовать этому протоколу. В этом интерфейсе есть метод под названием «main». Когда вы создаете объект, соответствующий этому интерфейсу, вся необходимая обработка будет происходить в этой «основной» функции.

Когда вызывается функция «processItemsForQueueTopic», она будет перебирать каждый элемент в очереди для указанной вами темы и вызывать функцию «main» для «queueItem» или задачи.

Создание задач

Создавать задачи очень просто. Он просто должен соответствовать интерфейсу IQueueItem.

let task1: IQueueItem = {
   main: function<T>(something?:T)
   {
      let calculation = 1 + 1;
      console.log(calculation);
   }
}

Причина, по которой задача должна соответствовать интерфейсу IQueueItem, заключается в том, что она должна иметь основную функцию, которую вы видите выше.

Эта функция будет содержать всю логику, необходимую для обработки всего, что вам нужно обрабатывать.

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

Пример другой задачи, но с темой «электронная почта»:

let task2: IQueueItem = {
   main: function<T>(something?:T)
   {
      let email = "[email protected]";
      console.log("Send mail to:", email);
   }
}

Добавление в очередь

Теперь все, что нужно, это добавить это в очередь следующим образом:

queue.addQueueItemForTopic(task1, "calculation");
queue.addQueueItemForTopic(task2, "email");

Это почти все, что нужно сделать, чтобы добавить его в очередь. После этого мы просто скажем очереди обработать или вызвать основную функцию.

Обработка задач в очереди

queue.processItemsForQueueTopic("calculation");
queue.processItemsForQueueTopic("email");

Когда мы хотим обработать все задачи для каждой темы, мы просто вызываем функцию processItemsForQueue с темой, для которой мы хотим, чтобы она запускалась, и все готово.

Это запустит все задачи, которые мы добавили в очередь.

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

Дайте мне знать, если есть что-то, что я могу улучшить с помощью этого кода, в комментариях!