gpt4 book ai didi

javascript - 如何让代码等待 Node js中的函数返回

转载 作者:行者123 更新时间:2023-11-30 20:52:58 25 4
gpt4 key购买 nike

我知道 Node js 是异步的,我已经查看了很多资源来解决这个问题但没有成功。我的问题是,我正在执行这个 mongodb 查询,但是我的函数在查询完成之前返回我知道 promise 并且我正在使用它们但它似乎不起作用,我做错了什么。我的代码可以在下面找到:

function findConversation(Id){
return new Promise(function(resolve, reject){
ConversationSchema.find({ 'participants.Id': Id }, function (err, conversations) {
if (err) return reject(err);
if (conversations) {
console.log("Conversation JSON: " + conversations)
}
resolve(conversations)
})
})
}

这是我正在执行的查询,但它是在波纹管函数中调用的:

function getConversations(user){
var newConversations = []

query.findConversation(user.userName).then(function(convers) {
if(convers) {
console.log("conversation was found: " + convers)
newConversations = convers
}
else {
console.log("conversation was not found: " + convers)
}
}).catch(function(reason) {
console.log("failure when finding conversation: " + reason)
})
return newConversations
}

现在上面的函数是不等待 promise 就返回的函数,下面我调用这个函数:

socket.on(VERIFY_USER, (nickname, callback)=>{

query.userExist(nickname).then(function(user){
if(user){
console.log("user exist")

var conversation = factories.getConversations(user)
console.log("Existing user Conversations: " + conversation)
callback({ userExist:true, user:factories.getUser(user, socket.id), conversations: conversation})
}
else {
console.log("user does not exist")
callback({ userExist:false, user:factories.createUser(nickname, socket.id), conversations:[]})
}
}).catch(function(reason) {
console.error(reason);
})
})
这总是返回现有用户对话:

最佳答案

请记住,在使用 promise 时,您必须在整个代码中使用它们。任何需要异步函数才能正确返回的东西也必须是异步的。我想您明白 query 不会在 getConversations 完成之前完成,并且 getConversations 不会等待查询完成。

所以这里 getConversations 的结构必须像 findConversation 一样,带有一个新的 Promise 并调用 resolve(newConversations)。然后,您将像之前调用它时一样使用 .then

factories.getConversations(user).then((conversation) => {
console.log("Existing user Conversations: " + conversation);
callback({userExist: true, user: factories.getUser(user, socket.id), conversations: conversation});
});

如果您发现使用 promises 太困难或太困惑,并且您能够使用 ES6,您应该使用 async/await .这将允许您编写代码,就好像它是同步的,但实际上仍然是非阻塞的。例如,如果 getConversations 是一个异步函数,您就可以非常简单地使用它:

let conversation = await factories.getConversations(user);
console.log("Existing user Conversations: " + conversation);
callback({userExist: true, user: factories.getUser(user, socket.id), conversations: conversation});

总的来说,您应该回顾一下 promises 是如何工作的,或者真正尝试了解 async/await 是如何工作的。

编辑:Related question

关于javascript - 如何让代码等待 Node js中的函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47973400/

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