我对 javascript 有点陌生。最近在做一个node.js的项目,遇到javascript异步回调的问题。我的代码如下:
理想情况下,我希望执行请求方法,然后执行 res.on('data') 事件的回调,最后调用 .each() 迭代器的回调。不幸的是,javascript 的异步特性导致程序甚至在执行第一个回调之前就退出主代码块。
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
是 Stream ,因此它不一定会到达单个 'data'
block 中。一旦流到达 'end'
,您将希望收集可能到达的任意数量的 block 并处理组合结果。
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
,它会为您处理流的消费:
request(options, function (err, res, body) {
var $ = cheerio.load(body);
// etc.
});
关于javascript - 修复异步 javascript 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18178994/