3

假设我有代码,像这样

function execute() {
    var tasks = buildListOfTasks();
    // ...
}

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

如果任务列表显示为空或所有任务都已执行,我需要再次重复相同的execute例程。再说一次,说“无限循环”。所以,它就像应用程序的守护进程。

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

4

3 回答 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();
于 2013-04-08T18:33:21.030 回答
1

如果您已经熟悉类似 的库async,可以使用execute()作为最终回调来重新启动任务:

function execute(err) {
    if (!err) {
        async.series(buildListOfTasks(), execute);
    } else {
        // ...
    }
}
于 2013-04-08T18:26:24.073 回答
0

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

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

async.parallel(tasks,
    function(err, results){
        if(!err) execute();
    }
);
于 2013-04-08T18:26:22.000 回答