新手求助:很简单的问题让我很疑惑,这个问题是因为异步执行的原因吗
下面两段代码主要的不同在于for( var i=0;i<topicUrls.length;i++){console.log(topicurls[i])}
的不同
# 代码一
var cheerio = require('cheerio');
var superagent = require('superagent');
var url = require('url');
var async = require('async');
var cnodeUrl = 'https://cnodejs.org/';
var topicUrls = [];
superagent.get(cnodeUrl)
.end(function(err,res){
if(err){
return console.error(err);
}
var $ = cheerio.load(res.text);
$('#topic_list .topic_title').each(function(idx,element){
var $element = $(element);
var href = url.resolve(cnodeUrl,$element.attr('href'));
topicUrls.push(href);
});
});
for (var i=0;i<topicUrls.length;i++){
console.log(topicUrls[i]);
}
# 代码二
var cheerio = require('cheerio');
var superagent = require('superagent');
var url = require('url');
var async = require('async');
var cnodeUrl = 'https://cnodejs.org/';
superagent.get(cnodeUrl)
.end(function(err,res){
if(err){
return console.error(err);
}
var topicUrls = [];
var $ = cheerio.load(res.text);
$('#topic_list .topic_title').each(function(idx,element){
var $element = $(element);
var href = url.resolve(cnodeUrl,$element.attr('href'));
topicUrls.push(href);
});
for(var i=0;i<topicUrls.length;i++){
console.log(topicUrls[i]);
}
});
‘代码一‘和’代码二’为什么会有这么大的不同,‘代码一’不能正常抓取页面,而‘代码二’可以?
请师傅们不吝赐教,在下不胜感激
8 回复
@xuelingzhizun 代码肯定不能获取到数据啊,因为你前面那个请求是异步的你把循环放到end外面去了这个时候是不会等end返回再执行后面的,而你后面那个是放在end函数里面的也即请求回来后才做的操作当然有数据了
@ncuzp 谢谢,你让我又多增长了些知识
对,就是异步的原因;
@zhaoxbrun 谢谢你的肯定
不懂,帮顶!
不懂,帮顶!
你的问题可以简化为 for(var i = 0;i< 3;i++){cosnole.log(i)}和for(var i = 0;i< 3;i++){setImmediate(function(){console.log(i)})}的区别;尽可能简化问题,排除不必要因素;
@haozxuan 谨记教诲