javascript - 修复异步 javascript 回调

标签 javascript node.js

我对 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', ...) 回调仅接收 httpreq 抛出的错误。它不会捕获来自 cheerio 的错误。

resStream ,因此它不一定会到达单个 '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/

相关文章:

javascript - stringByEvaluatingJavaScriptFromString 不执行操作

javascript - PDF 表格 提交至电子邮件

javascript - 有没有办法在 JS 函数类中使用属​​性获取和设置符号?

node.js - 在 Firebase CLI 中激活 Google Speech API?

node.js - 发送后无法设置 header 。在验证 header 处

javascript - 当我选择具有该 ID 值的选项时,如何显示包含与该 ID 相关的数据的表格?

c# - 如何在MVC中实现多个下拉列表

javascript - 使用 setState() 使用 API 中的数据更新 View - ReactJS

node.js - 没有找到 gulpfile 错误但是我清楚地安装了 gulp

node.js - 附加到 winston 记录的最后一行