0

更新:已解决,这确实是一个范围问题。我通过在数据库类中移动用户列表代码并返回预建列表来解决它。

使用 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})
}
4

1 回答 1

2

如果findUser()是异步的(您指出),那么问题是在调用 findUser()时尚未完成。showPage()

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

我不确切知道您要完成什么,但这是您需要使用的一般设计模式:

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})
    });
}

或者,如果为每个用户多次调用回调,您可以累积内容并调用showPage()最后一个回调:

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})
         }
    });
}
于 2013-05-08T18:21:37.677 回答