如何在其功能之外恢复查询mongodb的结果?

时间:2018-12-21 06:40:31

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

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

更确切地说,也许您可​​以发表评论,将我的变量放入转换对象中

现在我的结果是[约定的对象] 我尝试使用异步并答应了javascript,但我还不了解逻辑

非常感谢您

Gabriel

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

1 个答案:

答案 0 :(得分:0)

混合async functionPromise构造函数会使代码难以跟踪,并引起类似这样的问题。而是只将最底层的部分包装到Promise构造函数中,让tuem解析为有用的东西,然后使用async编写多个这样的Promises:

  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;
}