制作循环同步节点js web-kit

我的应用程序node.js webkit旨在扫描每个代理一个file.txt,并说如果代理工作。 但我有一个问题,当我的启动,他不等待testing结束“http.get”在行9上。当我的第一行被testing我的变种是在file.txt的最后一行如何在继续循环之前等待testing线11的结束?

var file = e.dataTransfer.files[i].path; content = fs.readFileSync(file, "UTF-8"); var lines = content.split("\n"); for (var n = 0; n < lines.length; n++) { var arr = lines[n].split(":"); http.get({host: arr[0], port: arr[1], path: "http://www.google.fr", agent: false}, function(res, req) { console.log(req); if(res.statusCode == 200){ el.className = ''; el.innerHTML = arr[0] + ':' + arr[1] + '\n'; } }); } 

您可以在http.getcallback中使用计数器,并使用“绑定”来调用该计数器以保留每次调用中的数据。

 var file = e.dataTransfer.files[i].path; content = fs.readFileSync(file, "UTF-8"); var lines = content.split("\n"); var counter = 0; var callback = function(res, req) { console.log(req); if(res.statusCode == 200){ el.className = ''; el.innerHTML = this[0] + ':' + this[1] + '\n'; } counter++; if(counter == lines.length) { //do whatever you wanna do after all calls } }; for (var n = 0; n < lines.length; n++){ var arr = lines[n].split(":"); http.get({ host: arr[0], port: arr[1], path: "http://www.google.fr", agent: false }, callback.bind(arr)); } 

这是大卫的详细答案:

 var async = require('async'); // make sure you install async (do "npm install async" from command line) var file = e.dataTransfer.files[i].path; content = fs.readFileSync(file, "UTF-8"); var lines = content.split("\n"); async.each(lines, function(line, callback) { var arr = line.split(":"); http.get({host: arr[0], port: arr[1], path: "http://www.google.fr", agent: false}, function(res, req) { console.log(req); if(res.statusCode == 200){ el.className = ''; el.innerHTML = arr[0] + ':' + arr[1] + '\n'; } callback(); }); },function(){ console.log("done"); }); 

我会build议你看看async.js库。 它有大量的函数来处理javascript的asynchronous性质。 具体来说,你会想使用async.each函数。

给你一个想法看看这个:

 async.each(..., function( file, callback) { http.get(...,function(){ callback(); }); },function(){ console.log("done"); }); 

或者,如果您想一个接一个地使用async.eachLimit ,则限制为1