新手关于异步回调的一些疑惑
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,应该会对楼主有帮助