2013-05-08 49 views
0

更新:解决了,这确实是一个范围问题。我通过移动数据库类中的用户列表代码并返回预建列表来解决这个问题。在node.js中执行异步调用时变量为空(闭包)

使用node.js,我做了一个异步调用函数findUser,并从回调中构建一个用户列表到变量内容中。在循环(它表示内容变量可用)期间这工作正常,但是当循环退出时,变量是空的。我该如何重写代码,以便在循环外部提供变量内容的值?

exports.listUsers=function(req,res) { 
    var content='' 
    isLoggedIn=user.findUser({},function(myuser) { 
     content = content +'<li>' + myuser.firstname + ' ' + myuser.lastname + "</li>\n"; 
      //here value of content var is available 
      console.log(content) 
    }) 
     //here value of content var is empty 
    console.log(content) 
    showPage(req,res,{'content':content}) 
} 
+0

这可能是一个范围界定问题吗?你可能会链接到一个现场版本,或尝试构建一个jsfiddle?我给它一个镜头,但没有发现任何有用的东西 – maaachine 2013-05-08 18:14:11

+1

当然,它是空的,回调被执行**异步**。你不是说过吗?或者你不明白这是什么意思? – Bergi 2013-05-08 18:23:18

回答

2

如果findUser()是异步的(你表示),那么问题是,当findUser()是​​叫尚未完成。

对于异步函数,您只能使用成功处理函数的结果。您不能调用异步函数,并期望像您当前的代码那样同步使用它。

我不知道到底你想实现什么,但是这是你需要使用的通用设计模式:

exports.listUsers=function(req,res) { 
    isLoggedIn=user.findUser({},function(myuser) { 
     var content = '<li>' + myuser.firstname + ' ' + myuser.lastname + "</li>\n"; 
     //here value of content var is available 
     console.log(content) 
     showPage(req,res,{'content':content}) 
    }); 
} 

或者,如果回调被调用多次一次每个用户,您可以累积内容并在最后一次回拨中致电​​:

exports.listUsers=function(req,res) { 
    var content = ""; 
    isLoggedIn=user.findUser({},function(myuser) { 
     content += '<li>' + myuser.firstname + ' ' + myuser.lastname + "</li>\n"; 
     //here value of content var is available 
     console.log(content) 
     // devise some logic to know when the last callback is being called 
     // perhaps based on a user count 
     if (this is the last user callback) { 
      showPage(req,res,{'content':content}) 
     } 
    }); 
} 
+0

它不适用于我的情况,因为每个用户都会调用一次匿名函数:showPage函数会被每次循环返回一个用户多次调用。而不是回调,我简化了事情,只返回预制列表 - 谢谢 – 2013-05-08 18:48:31

+0

@YounElan - 那么你需要积累像你这样做的内容,但知道什么时候回调被称为最后一次,并调用' showPage()'然后。我在我的答案中加入了一个例子。 – jfriend00 2013-05-08 18:54:35