обещание javascript после цикла foreach с множественной находкой мангуста - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь создать цикл с некоторыми вызовами БД, и как только все они будут выполнены, отправим результат.- Используя обещание, но если у меня есть мое обещание после обратного вызова, оно работает.

  let notuser = [];


  let promise = new Promise((resolve, reject) => {

  users.forEach((x) => {


    User.find({
      /* query here */
    }, function(err, results) {
        if(err) throw err

    if(results.length) {
          notuser.push(x);
          /* resolve(notuser)  works here - but were not done yet*/ 
        }
    })
  });

  resolve(notuser); /*not giving me the array */

}).then((notuser) => {

return res.json(notuser)

})

как я могу справиться с этим?

Ответы [ 2 ]

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

Ниже приведена функция с именем findManyUsers, которая делает то, что вы ищете.Mongo find вернет вам обещание, так что просто соберите эти обещания в цикле и запустите их вместе с Promise.all().Чтобы вы могли увидеть это в действии, я добавил ложный класс User с методом поиска, обещающим обещание ...

// User class pretends to be the mongo user. The find() method
// returns a promise to 'find" a user with a given id
class User {
    static find(id) {
        return new Promise(r => {
            setTimeout(() => r({ id: `user-${id}` }), 500);
        });
    }
}

//  return a promise to find all of the users with the given ids
async function findManyUsers(ids) {
    let promises = ids.map(id => User.find(id));
    return Promise.all(promises);
}

findManyUsers(['A', 'B', 'C']).then(result => console.log(result));
0 голосов
/ 22 декабря 2018

Я предлагаю вам взглянуть на async , это отличная библиотека для такого рода вещей и более, я действительно думаю, что вы должны привыкнуть к ее реализации.

Я бы решил вашпроблема с использованием следующей

const async = require('async')

let notuser = [];

async.forEach(users, (user, callback)=>{
     User.find({}, (err, results) => {
          if (err) callback(err)

          if(results.length) {
               notUser.push(x)
               callback(null)
          }
     })
}, (err) => {
     err ? throw err : return(notuser)
})

Однако, если вы не хотите использовать стороннюю библиотеку, вам лучше использовать promise.all и дождаться ее завершения.

РЕДАКТИРОВАТЬ: Не забудьте установить async, используя npm или yarn что-то похожее на yarn add async - npm install async

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...