NodeJS如何等待多任务完成

我想蜘蛛链接和所有的任务完成后,我想做别的事情。

如何跟踪完成任务对我来说很难,希望有人能帮上忙。

这里是我的代码:

var urlList=[]; //Ready file lines lineReader.eachLine('url.txt', function(line) { console.log('url is :'+line); urlList.push(line); }).then(function(){//After Read,begin to proceed each line console.log('read done!begin collect'); async.each(urlList,function(line){ console.log('begin line :'+line); //down each url download(line,function(data,cb){ var $=cheerio.load(data);//load cheerio var title=$('head>title').text();//get title console.log('title is '+title); }); }); //At here i want to track whether all urls has been download,and i can do something else if(/* allproceed */) { console.log('Task all done!Begin Next'); } }); function download(url, callback) { http.get(url, function(res) { var data = ""; res.on('data', function (chunk) { data += chunk; }); res.on("end", function() { callback(data); }); }).on("error", function(e) { console.log("Got error: " + e.message); callback(null); }); } 

希望可以有人帮帮我。

非常感谢。

我已经对你的代码做了一些修改,看看下面的结果:

 var urlList=[]; //Ready file lines lineReader.eachLine('url.txt', function(line) { console.log('url is :'+line); urlList.push(line); }).then(function(){//After Read,begin to proceed each line console.log('read done!begin collect'); async.each(urlList,function(line, callback){ console.log('begin line :'+line); //down each url download(line,function(err, data){ if (err) { return callback(err); } var $=cheerio.load(data);//load cheerio var title=$('head>title').text();//get title console.log('title is '+title); callback(null, title); }); }, function continueHere(err) { //At here i want to track whether all urls has been download,and i can do something else console.log('Task all done!Begin Next'); }); }); function download(url, callback) { http.get(url, function(res) { var data = ""; res.on('data', function (chunk) { data += chunk; }); res.on("end", function() { callback(null, data); }); }).on("error", function(e) { console.log("Got error: " + e.message); callback(e); }); } 

有些事情要特别注意:

你已经非常接近你的答案。 async.each()是一个可以用来完成工作的工具,但是你还没有正确使用。 您传递的迭代器函数( urlList每个项目调用的urlList )会采用一个callbackurlList ,如果完成该迭代的作业,则可以调用该callback函数。 我添加了callback。

async.each()还需要第三个参数:当所有任务完成时调用的函数。 在这个函数中,你可以把代码放在你的应用程序的其余部分。

关于使用callback:在node.js上重复的模式是传递给callback的第一个参数总是一个错误(如果存在的话)。 否则,该参数是undefined或为null 。 实际结果作为第二个parameter passing。 遵循这种模式是个好主意。 async ,例如,希望你服从它。 如果async.each()中的任何任务失败(通过将非空值作为第一个parameter passing给callback),则async考虑整个系列失败,并将该错误传递给系列callback(在代码中在函数continueHere之上)。

最后一件事。 虽然上面的代码应该可以工作,但它是将promise(由.then()语句表示)与callback混合在一起的。 这是pipe理asynchronous代码的两种不同的方法。 虽然你可以自由地混合起来,但是为了代码的可读性,它可能会帮助select一个模式并坚持下去)。