我的app node.js webkit旨在扫描每个代理一个file.txt并说明代理是否有效。 但是当我的发布时,我有一个问题,他不会等待测试的结束" http.get"在第9行。 当我的第一行被测试时,我的var n位于file.txt的最后一行 在继续循环之前如何等待测试线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';
}
});
}
答案 0 :(得分:2)
以下是David的详细答案:
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");
});
答案 1 :(得分:1)
我建议你看一下async.js库。它有大量的函数来处理javascript的异步性质。具体来说,您可能希望使用async.each
函数。
为了给你一点想法,请看一下:
async.each(..., function( file, callback) {
http.get(...,function(){
callback();
});
},function(){
console.log("done");
});
或者,如果您想要一个接一个地使用async.eachLimit
,其限制为1
。
答案 2 :(得分:1)
您可以在http.get回调中使用计数器,并使用“bind”调用它以保留每次调用中的数据。
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));
}