【问题标题】:How to recover a result of query mongodb outside of its function?如何在其功能之外恢复查询 mongodb 的结果?
【发布时间】:2019-05-21 15:49:50
【问题描述】:

我是一个新的 javascript 用户,我正在寻找内存请求的结果(计数)的救援者。

更准确地说,也许你可以评论一下,把我的变量放在我的 conv 对象中

现在我的结果是 [promised object] 我尝试了异步并承诺了 javascript,但我还不明白其中的逻辑

非常感谢,

加布里埃尔

                            var conversations = []
                            for (var i = 0; i < conversation.length; i++) {
                                for (var j = 0; j < conversation[i].users.length; j++) {
                                    conv = conversation[i].users[j]                 


                                    async function asyncCall() {
                                        function countUnread() {
                                            filterUnread = {$and:[
                                                {toID: user.properties.chat.id}, 
                                                {fromID: conversation[i].users[j].id},
                                                { read: false }]}
                                            return new Promise(resolve => {
                                                Message.countDocuments(filterUnread, function (err, count) {
                                                    resolve(count)
                                                })
                                            })
                                        }

                                        var count = await countUnread();
                                        console.log(count);
                                        console.log(conv)
                                        resolve(!!!!count!!!!) ;

                                    }
                                    asyncCall();
                                    conv.unread = !!!!I_want_my_count_here!!!!
                                    conversations.push(conv);
                                    resolve(conversations)
                                }
                            }

【问题讨论】:

  • await asyncCall() 也许?
  • 不,因为,不在异步函数中。如果我创建一个异步外部函数,我就会失去决心。是蛇咬自己的尾巴

标签: javascript mongodb promise async-await mongodb-query


【解决方案1】:

混合使用 async functions 和 Promise 构造函数会使代码难以跟踪并导致类似这样的问题。而是只将最低级别的部分包装到 Promise 构造函数中,让 tuem 解析为有用的东西,然后使用 async 组合多个这样的 Promise:

  const filter = { users: { $elemMatch: { id: user.properties.chat.id } } }

function getConversations(filter) {
  return new Promise(function(resolve, reject) {
     Conversation.find(filter, function(err, conversations) {
        if(err) reject(err) else resolve(conversations);
     });
  });
}

function countUnread(user) {
   const filterUnread = { $and:[
       {toID: user.properties.chat.id}, 
       {fromID: user.id},
       { read: false }
   ]};

   return new Promise((resolve, reject) => {
       Message.countDocuments(filterUnread, function (err, count) {
           if(err) reject(err) else resolve(count);
       });
   });
}


async function composeConversations() {
  const conversations = await getConversations();
  const result = [];

  for(const conversation of conversations) {
    for(const user of conversation.users) {
       const count = await countUnread(user);
       user.unread = count;
    }
    result.push(conversation);
  }
  return result;
}

【讨论】:

  • 我阅读问题的方式,conv.unread 应该是该对话中所有用户的所有未读聊天(?)的总和,即初始化user.unread = 0,然后user.unread += count;内循环。
  • result.push(conversation) 不只是组成一个与conversations 相同的数组吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
相关资源
最近更新 更多