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

时间:2015-08-25 17:39:25

标签: 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。

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

1 个答案:

答案 0 :(得分:2)

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