在单个进程中排队JavaScript代码

比方说,我在一个对象中有一堆的任务,每个都有一个date对象。 我想知道是否有可能使对象内的任务在单个进程中运行,并在调用date时触发。

这是一个例子:

var tasks = [ "when": "1501121620", "what": function(){ console.log("hello world"); }, "when": "1501121625", "what": function(){ console.log("hello world x2"); }, ] 

将这些数据存储在数据库中,以及从string中eval what脚本,我都没有问题。 我需要一个正确的方向。 我从来没有在节点世界看到过这样的事情。

我正在考虑使用hotload和使用文件系统,所以我不需要处理数据库。

我应该看看setInterval还是有更复杂的东西呢? 我知道像cron这样的东西存在,事情是我需要所有这些任务发生在已经存在的正在运行的进程中。 我需要能够添加一个新的任务队列没有结束的过程。

为了添加一个小环境,我需要一些排队socket.io.emit .emit()函数的方法。

不要重新发明轮子。 使用npm的cron包。 他是纯粹的js(使用从波纹pipe第二个变种)。 所有这些任务都将在已经存在的正在运行的过程中发生。 例如,你可以像这样创buildCronJob

 var CronJob = require('cron').CronJob; var job = new CronJob(1421110908157); job.addCallback(function() { /* some stuff to do */ }); 

在纯JavaScript中,只能通过setTimeoutsetInterval方法来完成。 有两种变体:

1)设置时间间隔callback,它将检查你的任务队列,并在适当的时间执行callback:

 setInterval(function() { for (var i = 0; ii = tasks.length; ++i) { var task = tasks[i]; if (task.when*1000 < Date.now()) { task.what(); tasks.splice(i,1); --i; } }; }, 1000); As you see accuracy of callback calling time will be dependent on interval time. Less interval time => more accuracy, but also more CPU usage. 

2)创build你的任务包装。 所以,当你想添加新的任务,你打电话给一些方法addTask ,这将与您的任务callback调用setTimeout 。 请注意, setTimeout最长时间为2147483647ms(大约25天)。 所以,如果你的时间超过最大时间,你必须设置超时最大时间与callback将被设置新的超时与剩余时间。 例如:

 var MAX_TIME = 2147483647; function addTask(task) { if (task.when*1000 < MAX_TIME) { setTimeout(task.what, task.when); } else { task.when -= MAX_TIME/1000; setTimeout(addTask.bind(null, task), MAX_TIME); } }