繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM