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

时间:2014-05-07 13:36:50

标签: javascript node.js asynchronous node-webkit

我的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';
            }
        });
    }

3 个答案:

答案 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));
}