Javascript 在node.js中执行异步调用时变量为空(闭包)
更新:解决了,这确实是一个范围问题。我通过在数据库类中移动用户列表代码并返回预构建的列表来解决这个问题 使用node.js,我对函数findUser进行异步调用,并将回调中的用户列表构建到变量内容中。这在循环期间(它表示内容变量可用)工作正常,但当循环退出时,变量为空。如何重写代码,使变量内容的值在循环之外可用Javascript 在node.js中执行异步调用时变量为空(闭包),javascript,node.js,closures,Javascript,Node.js,Closures,更新:解决了,这确实是一个范围问题。我通过在数据库类中移动用户列表代码并返回预构建的列表来解决这个问题 使用node.js,我对函数findUser进行异步调用,并将回调中的用户列表构建到变量内容中。这在循环期间(它表示内容变量可用)工作正常,但当循环退出时,变量为空。如何重写代码,使变量内容的值在循环之外可用 exports.listUsers=function(req,res) { var content='' isLoggedIn=user.findUser({},func
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})
}
exports.listUsers=函数(req,res){
变量内容=“”
isLoggedIn=user.findUser({},函数(myuser){
content=content+''+myuser.firstname+'+myuser.lastname+“ \n”;
//这里提供内容变量的值
console.log(内容)
})
//这里content变量的值为空
console.log(内容)
显示页面(请求、资源,{'content':content})
}
如果findUser()
是异步的(您指出了这一点),那么问题是调用showPage()
时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})
});
}
这是否可能是一个范围界定问题?您是否可以链接到一个实时版本,或者尝试构建一个JSFIDLE?我尝试了一下,但没有发现任何有用的东西当然是空的,回调是异步执行的。你不是自己说的吗?或者你不明白它的意思吗?在我的情况下,它不会起作用,因为匿名函数会为每个用户调用一次:函数showPage会被一个each循环调用多次,每次返回一个用户。而不是回调,我简化了事情,只返回预先制作的列表-Thanks@YounElan-然后您需要像以前一样累积内容,但要知道上次调用回调的时间,然后调用
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})
}
});
}