新手求助:很简单的问题让我很疑惑,这个问题是因为异步执行的原因吗
发布于 8 年前 作者 xuelingzhizun 3656 次浏览 来自 问答

下面两段代码主要的不同在于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)})}的区别;尽可能简化问题,排除不必要因素;

回到顶部