Javascript 为什么在节点中的A之前执行B?

Javascript 为什么在节点中的A之前执行B?,javascript,node.js,Javascript,Node.js,基本上,我这样做是因为我想将对象发送到jade模板。我可以在A控制台中获取对象,但在B控制台中,myObj未定义。我猜这是因为B控制台在getXXbyUsername之前执行,因为在getXXbyUsername回调中我定义了myObj 我不知道我是否解释了我的问题是什么,但我是乞丐,这是我能给出的最好的问题解释 节点js异步执行代码。在执行代码时,如果节点遇到需要一些时间才能执行的任务,则在完成此任务之前,它将继续执行下一行代码。 这种模式与PHP等语言不同。在您的代码中,XX.getXXBy

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


我不知道我是否解释了我的问题是什么,但我是乞丐,这是我能给出的最好的问题解释

节点js异步执行代码。在执行代码时,如果节点遇到需要一些时间才能执行的任务,则在完成此任务之前,它将继续执行下一行代码。 这种模式与PHP等语言不同。在您的代码中,
XX.getXXByUsername
是一个耗时的数据库操作。因此,它进入
console.log(“B:“+”+myObj)
在完成数据库操作之前,因此muObj未定义。解决此问题的一种方法是使用回调函数。在NodeJS中,对于每个函数,回调都作为
参数和回调将错误对象作为第一个参数,将主函数的结果作为下一个参数。在您的情况下,
doc
。回调仅在主
函数执行完成。因此,在
console.log(“A::+doc)
中,doc是
XX.getXXByUsername
函数的输出,因此它不是未定义的。

因为
getXXByUsername()
中的回调执行时间晚于此函数调用之后的代码。
换句话说,回调在函数(从数据库?)检索数据后执行。同时,主函数继续执行,因此您得到的
B
早于
A

这是的副本。您还可以使用类似async的库,这些库可以对异步函数进行字符串设置,以确保按所需顺序调用函数。
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});
});