新手关于异步回调的一些疑惑 - CNode技术社区

新手关于异步回调的一些疑惑
发布于 11 年前 作者 motecshine 4467 次浏览 最后一次编辑是 9 年前 来自 问答
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,应该会对楼主有帮助

回到顶部

AltStyle によって変換されたページ (->オリジナル) /