javascript - Node.js:代码在 Web 请求完成之前继续运行

标签 javascript node.js nonblocking

这是我的代码中不起作用的部分:

var companiesUrls = [];
var companiesUrls2 = [];

request(site+companiesPath, function(err, resp, body){
    if(!err && resp.statusCode == 200){
        var $ = cheerio.load(body);
        $('a', '#group-content').each(function(){
            var url = $(this).attr('href');
            companiesUrls.push(url);
    });
    console.log(companiesUrls.length);
    }
});
console.log(companiesUrls);
for(var i=0;i<companiesUrls.length;i+=2){
    companiesUrls2.push(companiesUrls[i]);
};
console.log(companiesUrls2);

这是此代码产生的输出:

[]
[]
102

我的理论是,node.js 的“非阻塞”性质导致请求在其余代码之后运行。因此,我的 for 循环得到的是空数组,而不是包含 102 个项目的数组。

我该如何解决这个问题?

最佳答案

var companiesUrls = [];
var companiesUrls2 = [];

request(site+companiesPath, function(err, resp, body){
    if(!err && resp.statusCode == 200){
        var $ = cheerio.load(body);
        $('a', '#group-content').each(function(){
            var url = $(this).attr('href');
            companiesUrls.push(url);
    });
    console.log(companiesUrls.length);
    }
   console.log(companiesUrls);
   for(var i=0;i<companiesUrls.length;i+=2){
       companiesUrls2.push(companiesUrls[i]);
   };
   console.log(companiesUrls2);
});

好吧,很简单。但是如果该代码需要在函数内运行怎么办?常见的解决方案是提供回调作为函数的参数。 Node 代码经常使用回调是很常见的,因为从性能的 Angular 来看,这通常是最好的方法。

function getCompanyUrls(callback) {
   var companiesUrls = [];
   var companiesUrls2 = [];

   request(site+companiesPath, function(err, resp, body){
       if(!err && resp.statusCode == 200){
           var $ = cheerio.load(body);
           $('a', '#group-content').each(function(){
               var url = $(this).attr('href');
               companiesUrls.push(url);
       });
       console.log(companiesUrls.length);
       }

      console.log(companiesUrls);
      for(var i=0;i<companiesUrls.length;i+=2){
          companiesUrls2.push(companiesUrls[i]);
      };
      console.log(companiesUrls2);

      callback(companiesUrls2);
   });
}

getCompanyUrls(function( urls ) {
   // do something with the resulting urls.
});

关于javascript - Node.js:代码在 Web 请求完成之前继续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25487293/

相关文章:

javascript - 使用 CDN 与 NPM 安装库

node.js - 使用 Zombie 测试 Node.js 应用程序

具有非阻塞读取的 Bash 脚本

javascript - Node.js 无阻塞地写入数组

javascript - 战舰游戏: Allowing hits to be registered on ships with lengths other than 4

javascript - 复选框的奇怪 onclick 行为。选择复选框项目时尝试写入浏览器控制台

node.js - 无法在 EC2 上使用 npm 安装 bcrypt

node.js - 如何在 nodejs-dialogflow 中使用 Dialogflow 环境(测试版功能)

Python Pyserial 同时从多个串口读取数据

javascript - 循环数组并在下拉列表中显示 - Angular