最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

如何使代码等待节点js中的函数返回

运维笔记admin11浏览0评论

如何使代码等待节点js中的函数返回

如何使代码等待节点js中的函数返回

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

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)
    })
	})
}
回答如下:

请记住,在使用promises时,您必须在整个代码中使用它们。任何需要异步函数才能正确返回的东西也必须是异步的。我认为你确实理解querygetConversations之前没有完成,并且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});
});

如果您发现使用承诺太难或太乱,并且您可以使用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

发布评论

评论列表(0)

  1. 暂无评论