无限执行Node.js应用程序的任务

3
假设我有这样的代码:
function execute() {
    var tasks = buildListOfTasks();
    // ...
}

buildListOfTask 创建函数数组。这些函数是异步的,可能会发出HTTP请求或/和执行数据库操作。

如果任务列表为空或所有任务都已执行,则需要再次重复相同的execute例程。而且,需要在“无限循环”中重复执行。因此,它类似于守护程序应用。

我可以很好地理解如何在同步世界中完成它,但有点困惑如何在node.js异步世界中实现它。


有用的链接,也许是 https://github.com/creationix/step - Alex Wayne
使用jQuery的延迟对象的概念。我认为甚至有一个模仿这个的JavaScript库。 - Ian
1
setTimeout有什么问题?o_O - Eldar Djafarov
Ian 比我先完成了,使用不同的对象是一个好方法。这个想法是通过让任务调用一个函数来告诉另一个对象它们如何完成,从而让另一个对象管理任务队列。当队列管理对象看到所有任务都完成时,它可以再次调用 execute - nwellcome
1
是的,执行函数execute() { var tasks = buildListOfTasks(); if(tasks.length ===0) {return setTimeout(execute,100)} /***/} - Eldar Djafarov
显示剩余2条评论
3个回答

6
使用async.js和它的队列对象。
function runTask(task, callback) {
    //dispatch a single asynchronous task to do some real work
    task(callback);
}
//the 10 means allow up to 10 in parallel, then start queueing
var queue = async.queue(runTask, 10);

//Check for work to do and enqueue it
function refillQueue() {
  buildListOfTasks().forEach(function (task) {
    queue.push(task);
  });
}    

//queue will call this whenever all pending work is completed
//so wait 100ms and check again for more arriving work
queue.drain = function() {
  setTimeout(refillQueue, 100);
};

//start things off initially
refillQueue();

看起来非常接近我所需要的.. 我会尝试! - Alexander Beletsky

1
如果您已经熟悉像async这样的库,您可以使用execute()作为最终回调来重新启动任务:
function execute(err) {
    if (!err) {
        async.series(buildListOfTasks(), execute);
    } else {
        // ...
    }
}

这段代码会导致stackoverflow异常吗? - Alexander Beletsky
2
由于这些是异步调用,即使执行将被多次调用,每个异步回调都会重置堆栈,因此您不会溢出。 - Peter Lyons
然而,你需要真正查看 err 参数,而不仅仅是盲目地在一个紧凑的循环中继续触发 async.series,如果它正在抛出错误。 - Peter Lyons

0

我认为你需要使用async.js,可能是parallel函数。https://github.com/caolan/async#parallel

在全局回调中,只需调用execute进行递归调用即可。

async.parallel(tasks,
    function(err, results){
        if(!err) execute();
    }
);

1
队列比这个更安全,因为它有最大并发限制。例如,如果对buildListOfTasks的调用返回了800个数据库查询,这可能会使您的数据库崩溃。 - Peter Lyons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接