Как восстановить результат запроса mongodb вне его функции? - PullRequest
0 голосов
/ 21 декабря 2018

Я новый пользователь javascript и ищу спасателя результат (количество) запроса памяти.

Точнее, возможно, вы можете прокомментировать, поместите мою переменную в мой объект conv

прямо сейчас мой результат - [обещанный объект] Я пытался с асинхронным и обещанным 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)
                                }
                            }

1 Ответ

0 голосов
/ 21 декабря 2018

Сочетание конструкторов async function s и Promise затрудняет отслеживание кода и вызывает проблемы, подобные этой.Вместо этого оберните только самые низкоуровневые части в конструкторы Promise, позвольте tuem разрешить что-то полезное, затем скомпонуйте несколько таких обещаний, используя async:

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