这是我的代码中不起作用的部分:
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/