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/