http.get异步带来的困扰
发布于 11 年前 作者 ggaaooppeenngg 5161 次浏览 最后一次编辑是 8 年前
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 回复

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

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

@ggaaooppeenngg 对的, CPS, 后续传递风格

回到顶部