2016-01-10 3 views
2

Я работаю над функцией NodeJS, которая имеет ряд асинхронных задач, которые необходимо выполнить.NodeJS Queuing Asynchronous Functions

Я читал в массиве tasks, вытащил из базы данных, и каждый task имеет свойство runFrequency.

пример:

var tasks: [ 
     task1: { 
      type: doSomething, 
      ..., 
      runFrequency: 10 // Needs to run every 10 seconds. 
     }, 
     task2: { 
      type: doSomethingElse, 
      ..., 
      runFrequency: 30 // Needs to run every 30 seconds. 
     }, 
     task3: { 
      type: doSomething, 
      ..., 
      runFrequency: 10 
     } 
    ]; 

Мне нужно вызвать processTask() функцию для выполнения каждой из задач каждые runFrequency настройки, но только запустить одну задачу за один раз. (10-секундная RunFrequency - это всего лишь цель, она не должна быть ровно 10 секунд).

пример

12:00:00: processTask(task1); 
    12:00:02: task1 completes, task1 scheduled to run again at 12:00:12, 
    12:00:02: processTask(task2); 
    12:00:05: task2 completes, task2 scheduled to run again at 12:00:35, 
    12:00:05: processTask(task3); 
    12:00:10: task3 completes, task3 scheduled to run again at 12:00:20, 

    // all tasks finished, next task isn't scheduled to start until 12:00:12, 

    12:00:12: processTask(task1); 
    12:00:25: task1 completes, task1 scheduled to run again at 12:00:35, 
    12:00:25: task2 was scheduled to start at 12:00:20, it's the next task in the queue so it needs to be run now. 

Что бы лучший способ создания такого рода «очереди задач» в NodeJS?

Я посмотрел на Куэ и Редис, но я не уверен, что это именно то, что я хочу.

Спасибо,

ответ

0

Если у вас есть предопределенный набор задач, которые вы хотите запланировать, вы можете просто перебирать их и установить интервалы.

'use strict'; 
let tasks = [ 
    { 
     name: 'Check StackOverflow', 
     frequency: 1, 
     taskFn:() => console.log('Checking StackOverflow...') 
    }, 
    { 
     name: 'Check Email', 
     frequency: 3, 
     taskFn:() => console.log('Checking email...') 
    }, 
    { 
     name: 'Download the Internet!', 
     frequency: 5, 
     taskFn:() => console.log('Downloading the internet') 
    } 
]; 

for (let task of tasks) { 
    console.log(`Scheduling ${task.name}`); 
    setInterval(task.taskFn, task.frequency * 1000); 
}