javascript - 为什么 Node 中B先于A执行?

标签 javascript node.js

router.get('/xyz', function(req, res, next) {
  var myObj;

  XX.getXXByUsername("ee", function(err, doc){
    console.log("A: " + doc); //executes second, doc is object that I want

    myObj = doc; 

  });

  console.log("B: "+ " " + myObj); //executes first, myObj = undefined

  res.render("pr", {title: "XX", myObj: myObj});
});

基本上,我这样做是因为我想将对象发送到 Jade 模板。我可以在 A 控制台中获取对象,但在 B 控制台中 myObj 未定义。我猜这是因为 B 控制台在 getXXbyUsername 之前执行,因为在 getXXbyUsername 回调中我定义了 myObj。

我不知道我是否解释了我的问题是什么,但我是初学者,这是我能给出的问题的最佳解释。

最佳答案

Node js 异步执行代码。在代码执行时,如果 Node 遇到需要一些时间执行的任务,它会在完成该任务之前继续执行下一行代码。 这种模式与 PHP 等语言不同。在您的代码中,XX.getXXByUsername 是一个非常耗时的数据库操作。所以它继续到 console.log("B: "+ ""+ myObj); 在完成数据库操作之前,因此 muObj 是未定义的。解决此问题的一种方法是使用回调函数。在 Node js 中,对于每个函数,回调都会传递为 一个参数,回调函数将错误对象作为第一个参数,将主函数的结果作为下一个参数。就您而言,doc。回调仅在 main 之后执行 函数执行完成。因此,在 console.log("A: "+ doc) 中,doc 是 XX.getXXByUsername 函数的输出,因此它不是未定义的。

关于javascript - 为什么 Node 中B先于A执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32210599/

相关文章:

javascript - 在javascript中将类添加到nodeList上的单击按钮

javascript - 如何在 ID 属性中存储 HTML 标记?

javascript - mocha 错误 : No test files found: "test/" npm ERR! 测试失败

javascript - 在 Node.js 中验证 WooCommerce REST API

javascript - 将鼠标悬停在另一个元素上时如何向上滚动 div

javascript - 让 webpack 包含 html 文件

javascript - Slick carousel - 强制幻灯片具有相同的高度

javascript - 抓取 opengraph 时遇到问题

node.js - 如何知道值为空

node.js - 如何严格指定返回类型 Angular4/ionic3