1

我对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);
});

谁能指出我正确的方向,让我的代码按照我的预期工作?谢谢。

4

1 回答 1

2

除非您遇到未处理的错误,否则它不应突然停止。而且,很可能,该错误可能来自cheerio您可能没有将整个文档交给它来尝试解析。

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

res是一个Stream,因此它不一定会以'data'. 一旦流到达'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,它为您处理消费流:

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

    // etc.
});
于 2013-08-12T04:16:49.157 回答