![](/img/trans.png)
[英]Why do the spawned child process in node fire close event even before getting executed?
[英]Why is B executed before A in node?
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});
});
基本上,我这样做是因为我想将对象发送到玉模板。 我可以在A控制台中获取对象,但是在B控制台中myObj是未定义的。 我猜这是因为B控制台在getXXbyUsername之前执行,因为在getXXbyUsername回调中定义了myObj。
我不知道我是否解释了我的问题,但是我是初学者,这是我可以给出的最好的解释。
Node js异步执行代码。 在执行代码时,如果节点遇到需要花费一些时间才能执行的任务,则它会在完成此任务之前继续执行下一行代码。 这种模式不同于PHP之类的语言。 在您的代码中, XX.getXXByUsername
是一项数据库操作,这很耗时。 因此它进入console.log("B: "+ " " + myObj);
在完成数据库操作之前,因此未定义muObj。 解决此问题的一种方法是使用回调函数。 在节点js中,对于每个函数,都将回调作为参数传递,并且回调将错误对象作为第一个参数,并将主函数的结果作为下一个参数。 就您而言, doc
。 仅在主函数执行完成后才执行回调。 因此,在console.log("A: " + doc)
,doc是XX.getXXByUsername
函数的输出,因此它不是未定义的。
因为getXXByUsername()
回调比该函数调用之后的代码执行晚。 换句话说,在函数从数据库中检索数据后执行回调。 同时main函数继续执行,因此您比A
早得到B
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.