【问题标题】:Having an issue with callback function回调函数有问题
【发布时间】:2020-09-11 18:01:42
【问题描述】:

所以我有一些这样的代码

const getAPIData = (symbol, callback) => {
  var options = {
    url: "https://api.binance.com/api/v3/ticker/price",
    method: "GET",
    qs: {
      symbol
    },
  };
  request(options, (err, res, body) => {
    body = JSON.parse(body);
    callback(body);
  });
};

var isValid = 0;
getAPIData(symbol, (body) => {
  console.log(body);
  if (body.symbol) {
    console.log("yes");
    isValid = 1;
  } else {
    console.log("no");
  }
});

执行此回调后,无论结果如何,“isValid”变量仍保持为 0。尽管控制台同时记录了 yes 和 no 。调试程序时,isValid 变量仍然为 0。

console.log 函数如何工作而不将 isValid 设置为 1?就像它只是跳过那条线或者我不确定。请帮帮我!

【问题讨论】:

  • 代码中isValid的值是从哪里打印出来的?
  • 如果在此函数下有条件权限,它会检查 isValid > 0 (总是被拒绝,因为 isValid 由于某种原因总是为 0。我还在 VSCode 中调试了程序并显示相同
  • 将条件放入回调中。

标签: javascript node.js asynchronous callback


【解决方案1】:

这是异步调用的工作方式。

  var isValid = 0;
  getAPIData(symbol, (body) => {
    console.log(body);
    if (body.symbol) {
      console.log("yes");
      isValid = 1;
      console.log(isValid); // 1
    } else {
      console.log("no");
    }
  });

console.log(isValid); // 0
// when the JS engine gets here, isValid will still be 0
// since getAPIData is asynchronous and it's still in progress at this point
// also, you cannot use any results of getAPIData here

【讨论】:

  • 附带说明,您应该使用boolean 类型来存储真/假标志,而不是数字。
  • 感谢它现在的工作,但如果标志集仅在异步函数中有效。如何全局设置一个标志,以便我可以使用它在函数外运行条件?还是那样不行?
  • 您可以全局设置任何标志,但更改仅对异步回调中的以下代码可见。所以所有的返回数据处理逻辑都必须放在回调中。如果流程中有其他异步步骤,这很快就会成为所谓的“回调地狱”,但有办法通过使用承诺链或异步等待语法将其重构为更清晰的形式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 2021-06-09
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 2020-08-02
相关资源
最近更新 更多