gpt4 book ai didi

javascript - 在node.js中执行异步调用时变量为空(闭包)

转载 作者:行者123 更新时间:2023-12-02 18:45:18 26 4
gpt4 key购买 nike

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

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

最佳答案

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

或者,如果每个用户多次调用回调,您可以累积内容并在最后一次回调时调用 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})
}
});
}

关于javascript - 在node.js中执行异步调用时变量为空(闭包),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16447071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com