新手关于异步回调的一些疑惑
发布于 10 年前 作者 motecshine 4085 次浏览 最后一次编辑是 8 年前 来自 问答
var http=require('http');

var option={
      host:'www.baidu.com',
      port:80,
      method:'POST'
}
var next=function(chunks){
     //发送给 客户端
    console.log('next:'+chunks);
}


var req = http.request(option,function(res){
      console.log('status:'+res.statusCode);
      console.log('headers:'+JSON.stringify(res.headers));
      //异步回调
      res.on('data',function (chunks){
          next(chunks);
      });
    console.log('是异步吗?');
     res.on('end',function(){

      });
     res.on('error',function(e){
           console.log('problem'+ e.message);
      });
});
     req.end();
\n```


我现在想在外部获取 chunks 的值 就像这样
 var d=【chunks 的值】 
 console.log(d);
 该怎么获取呢。
7 回复

你要获取 chunks 的位置是"现在", 而异步回调是在"将来". 你只有在"将来"才能知道 chunks 的值是什么. 也就是说要使用 chunks 就在 next 函数里吧, 或者在 next 函数里调用别的函数把 chunks 当参数传过去.

@wuliao49 谢谢 ,有点被传统观念的编程思想迷惑了,其实是在回调函数里做将来的事情

如果你是被一层一层的回调嵌套搞晕了头,可以试试eventproxy或者是async等解决流程问题的组件(本质依然靠回调),但是nodejs毕竟是非阻塞事件驱动机制的语言,一定要区别于传统线性编程的思想

应该在end事件中才将全部数据返回给客户端吧。例如:

var data = {};
var req = http.request(options, function(response) {
    var bufferHelper = new BufferHelper();
    response.on('data', function(chunk) {
        bufferHelper.concat(chunk);
    });
    response.on('end', function() {
        var iconv = new Iconv('GBK', 'utf-8');
        var resultBuffer = iconv.convert(bufferHelper.toBuffer());

        var result = resultBuffer.toString();
        var $ = cheerio.load(result);
        $("select option").each(function() {
            //console.log("value:%s-text:%s",$(this).val(), $(this).text().replace('*', ''));

            if ($(this).val()) {
                data[$(this).val()] = $(this).text().replace('*', '');
            }
        });
        cb(data);
    });
});
// write data to request body
req.end();

可以了解一下Promise,应该会对楼主有帮助

回到顶部