修复异步javascript回调
我对javascript有点陌生。最近,我在一个node.js项目中工作,遇到了javascript中异步回调的问题。我的代码如下: 因此,理想情况下,我希望先调用request方法,然后执行res.on('data')事件的回调,最后调用.each()迭代器。不幸的是,javascript的异步特性导致程序甚至在执行第一次回调之前就退出主代码块修复异步javascript回调,javascript,node.js,Javascript,Node.js,我对javascript有点陌生。最近,我在一个node.js项目中工作,遇到了javascript中异步回调的问题。我的代码如下: 因此,理想情况下,我希望先调用request方法,然后执行res.on('data')事件的回调,最后调用.each()迭代器。不幸的是,javascript的异步特性导致程序甚至在执行第一次回调之前就退出主代码块 var req = https.request(options, function(res) { // console.log("statusCo
var req = https.request(options, function(res) {
// console.log("statusCode: ", res.statusCode);
// console.log("headers: ", res.headers);
console.log('1st call back exec');
res.on('data', function(d) {
console.log('2st call back exec');
var $ = cheerio.load(d);
//traversing method
$('.dddefault').each(function(i){
console.log('3st call back exec');
if(i == 3){
remainingSeats = parseInt($(this).text().trim());
console.log('inner0:'+remainingSeats);
return;
}
});
console.log('inner1:'+remainingSeats);
});
console.log('inner2:'+remainingSeats);
});
req.end();
req.on('error', function(e) {
console.error(e);
});
有人能给我指出正确的方向,让我的代码按照我的预期工作吗?谢谢。除非您遇到未处理的错误,否则它不应该突然停止。而且,这个错误很可能来自
cheerio
,因为您可能没有给它提供要尝试解析的整个文档
注意:req.on('error',…)
回调只接收http
或req
抛出的错误。它不会捕获来自cheerio
的错误
res
是一个函数,因此它不一定是在一块数据中到达的。您需要收集可能到达的任意数量的块,并在流到达“结束”
后处理组合结果
var req = https.request(options, function(res) {
var body = [];
res.setEncoding('utf8');
res.on('data', function (chunk) {
body.push(chunk);
});
res.on('end', function () {
body = body.join('');
var $ = cheerio.load(body);
// etc.
});
您也可以考虑使用,它为您处理流:
request(options, function (err, res, body) {
var $ = cheerio.load(body);
// etc.
});
嘿,谢谢你的回复,这实际上帮助我解决了我遇到的另一个问题(不一致的数据读取),但我帖子中的问题更多的是流量控制问题。虽然,我想我已经明白了,我可以在最里面的回调中调用另一个回调,我应该会没事的。感谢您指出,虽然响应是一条流!