修复异步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

我对javascript有点陌生。最近,我在一个node.js项目中工作,遇到了javascript中异步回调的问题。我的代码如下:

因此,理想情况下,我希望先调用request方法,然后执行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
是一个函数,因此它不一定是在一块
数据中到达的。您需要收集可能到达的任意数量的块,并在流到达
“结束”
后处理组合结果

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.
});

嘿,谢谢你的回复,这实际上帮助我解决了我遇到的另一个问题(不一致的数据读取),但我帖子中的问题更多的是流量控制问题。虽然,我想我已经明白了,我可以在最里面的回调中调用另一个回调,我应该会没事的。感谢您指出,虽然响应是一条流!