修复asynchronous的JavaScriptcallback

我有点新的JavaScript。 最近,我一直在研究一个node.js项目,并且遇到了javascript中asynchronouscallback的问题。 我的代码如下:

所以理想情况下,我想请求方法被执行,然后执行res.on('data')事件的callback,最后调用.each()迭代器的callback函数。 不幸的是,即使在第一个callback被执行之前,javascript的asynchronous特性也会导致程序退出主代码块。

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因为你可能没有给它整个文件去parsing。

注意: req.on('error', ...)callback只接收httpreq抛出的错误。 它不会从cheerio错误。

res是一个Stream ,所以它不一定会到达一个'data'块。 您将要收集任何数量的可能到达的数据块,并在数据stream达到'end'组合的结果。

 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 ,它会为您处理消耗stream:

 request(options, function (err, res, body) { var $ = cheerio.load(body); // etc. });