Обещание внутри forEach - PullRequest
       8

Обещание внутри forEach

0 голосов
/ 01 июня 2018
  Current.senders.forEach(sender => {
    let UserList = Meteor.users.findOne({"_id":sender});
    console.log(UserList.profile.name)
  });

Он будет проходить через отправителей документа A, будет искать имя_файла в документе B.

Проблема в том, что я получаю только первое, остальные не определены.

Есть ли способ получить их с обещанием?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018
// helper function to keep the rest of the code neat
const findUserBySender = sender => Meteor.users.findOne({"_id": sender});


async function test() {
    // run all searches in parallel via .map(), and await the overall result
    let userList = await Promise.all(Current.senders.map(findUserBySender));
    console.log(userList);
}

Вместо асинхронного / ожидающего вы, конечно, можете использовать Promise.all(...).then(userList => { ... }).

0 голосов
/ 01 июня 2018

Вы можете использовать async/await, чтобы дать обещание подождать, если вам нужно, чтобы find запускался один за другим.

Current.senders.forEach((sender) => {
  const UserList = await Meteor.users.findOne({"_id":sender});

  console.log(UserList.profile.name);
});

Либо вы можете использовать Promise.all запустить все ваши find одновременно и затем обработать возврат.

const UserLists = await Promise.all(Current.senders.map(sender => Meteor.users.findOne({ "_id": sender })));

или

Promise.all(Current.senders.map(sender => Meteor.users.findOne({ "_id": sender })))
  .then((UserLists) => {
     // Deals with ok
  })
  .catch((err) => {
     // Deals with error
  });

UserLists здесь содержит все find результаты в массиве.

...