Node.js:代码在web请求完成之前一直运行

Node.js: Code keeps running before web request finishes

本文关键字:一直 运行 请求 js 代码 web Node      更新时间:2023-09-26

这是我的代码不能工作的部分:

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

好,很简单。但是如果代码需要在函数中运行呢?常见的解决方案是提供回调函数作为函数的参数。节点代码经常使用回调是很常见的,因为从性能的角度来看,这通常是最好的方法。

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.
});