如何从回调函数中修改全局变量。在 node.js 中

Posted

技术标签:

【中文标题】如何从回调函数中修改全局变量。在 node.js 中【英文标题】:How can i modify a global variable from within a callback function . in node.js 【发布时间】:2021-09-18 05:56:36 【问题描述】:

在 node.js 中,我想将 mysql 查询的结果存储在全局变量中,以便我可以将其导出或将其记录到控制台中,但似乎全局变量没有从回调函数中修改,那能做什么呢?请帮忙,tgis是我的简单代码

    var mysql = require("mysql");
var text = "begin : ";
var con = mysql.createConnection(
  host: "localhost",
  user: "root",
  password: "",
  database: "ajax",
);
con.connect(function (err) 
  if (err) throw err;

  var sql = "SELECT * FROM `nom`";
  con.query(sql, function (err, result) 
    if (err) throw err;

    result.forEach((row) => 
      text +=
        "  the first is : " +
        row.first +
        " and the second is : " +
        row.second +
        "\n";
    );
  );
  con.end();
);

console.log(text);

【问题讨论】:

【参考方案1】:

您当前的代码不是完全同步的,即第 1 行、第 2 行和第 3 行可能执行为第 1 行、第 3 行、第 2 行。您的代码是异步的,因为您调用了使用回调的con.connect(即当它尝试连接到您的 mysql 数据库时,将调用您提供的函数)。如果您想在连接后打印文本,则不建议使用全局变量或更准确地说是在代码末尾使用 console.log(text);,因为 console.log(text); 可能在 con.connect 尝试连接之前运行到您的数据库。因此,以下是针对此特定示例的一项建议:

var mysql = require("mysql");
var text = "begin : ";
var con = mysql.createConnection(
  host: "localhost",
  user: "root",
  password: "",
  database: "ajax",
);
con.connect(function (err) 
  if (err) throw err;

  var sql = "SELECT * FROM `nom`";
  con.query(sql, function (err, result) 
    if (err) throw err;

    result.forEach((row) => 
      text +=
        "  the first is : " +
        row.first +
        " and the second is : " +
        row.second +
        "\n";
    );
    console.log(text); 
    //write code to export to file/remote service here
  );
  con.end();
);


javascript Function Scope 是我所关注的另一个特殊兴趣,并且有许多资源可以描述和探索这一点。建议在您未来的代码中,特别是因为您正在使用异步代码,您尝试本地化或在您的函数范围内工作,并避免使用将在不同时间由不同函数修改的全局变量,这可能难以预测和因此会认为您的项目/代码“不可预测”。

【讨论】:

?谢谢你先生,这太漂亮了,非常感谢你宝贵的时间,我想知道最后一件事,如果你能先生,我可以在回调函数中导出一些东西吗? , 您可以在回调函数中导出和执行其他活动。不客气。祝您的项目好运,请记得点赞并将此答案标记为您问题的正确答案,以便有类似疑问的其他 S/O 用户可能会发现这很有用。 oooookkk 先生,谢谢先生,您给我们一些时间真是太好了

以上是关于如何从回调函数中修改全局变量。在 node.js 中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node.js 流回调中聚合从异步函数生成的 Promise?

如何从 google-cloud-platform vminstance 中的 pubsub 回调函数调用全局变量?

Node js 安装+回调函数+事件

Node.js:如何从回调中正确返回对象?

node.js 回调获取变量的意外值

vue webpack main.js 里面能设置全局变量吗