CNode

http.get异步带来的困扰

Gggaaooppeenngg发布于13 年前最后回复13 年前4 回复5704 浏览0 收藏
webot.set('news',{
  pattern: /new.*/i,
  handler:function(info){
    news = [];
    http.get(address, function(res){
        var data = '';

        res.on('data' , function(d){
            data += d;
        }).on('error',function(err){
        console.log(err.message);
        });

        res.on('end' , function(){
        //分析HTML找到需要的内容,并赋给news
        var $ = cheerio.load(data);
        $('table').eq(2).find('table').eq(1).find('tr').slice(1,13)
        .each(function(index,ele){
            news[index] = {
                title:this.find('a').first().text(),
                url:this.find('a').attr('href')
            };
        })    
        }).on('error',function(err){
            console.log(err.message);
        });
    }).on('error', function(err){
        console.log(err.message);
    });
    return news;
  }
});

用之前公布的微信ROBOT做一个微信机器人。分析HTML然后返回结果,作一个简单的爬虫。但是news被直接返回了,还没等到http.get执行完,这个时候应该怎么办,有什么异步返回方法么?

查看回复

回复 (4)

D
danielking#1·13 年前

看看async库

J
jiyinyiyong#2·13 年前

正常执行顺序就是这样的, 常用的方案是在 handler 后边传一个回调函数 (info, callback) get 请求完成以后调用回调函数, 把后边的操作写在回调函数函数体里边

G
ggaaooppeenngg#3·13 年前
引用 jiyinyiyong正常执行顺序就是这样的, 常用的方案是在 handler 后边传一个回调函数 (info, callback) get 请求完成以后调用回调函数, 把后边的操作写在回调函数函数体里边

我看了一下源码的例子,他在里面用了中间件一层一层的处理,只要传一个next,调用后交给最后处理的函数就可以。

参与回复
登录后即可参与回复。登录