Как Promise.all для вложенных массивов? - PullRequest
0 голосов
/ 25 октября 2018

Структура данных:

tasks: [
  {
    name: "get milk",
    users: ["abc", "def"]
  },
  {
    name: "buy bread",
    users: ["def", "ghi"]
  }
]

Мне нужно получить адрес электронной почты каждого из пользователей из базы данных (пока все хорошо) и дождаться завершения всех задач, затем переместитьи делать что-то с данными.Место, где это не работает, написано в комментариях ниже:

var tasks_with_emails = tasks.map(function(task) {
  var emails = task.users.map(function(user) {
    return user_to_email(user); // from the database
  });
  Promise.all(emails).then(function(emails) {
    task.emails = emails;
    console.log(task); // this one works fine
    return task;
  }).catch(next);
});
Promise.all(tasks_with_emails).then(function(tasks) {
  console.log(tasks); // <==== this one fires too quickly
}).catch(next);

Так что tasks_with_email должен дождаться разрешения всех вложенных emails, но это не так.

1 Ответ

0 голосов
/ 25 октября 2018

После добавления возврата перед Promise.all() ваш код работает для меня, как вы можете видеть в приведенном ниже примере.Посмотрите, что возвращает user_to_email().Это должно быть обещание, которое преобразуется в строку электронной почты.

const user_to_email = user => new Promise(( resolve, reject ) => {
  setTimeout(() => resolve( `${ user }@example.com` ), 3000 );
});
const tasks  = [
  {
  name: "get milk",
  users: ["abc", "def"]
  },
  {
  name: "buy bread",
  users: ["def", "ghi"]
  }
];
const tasks_with_emails = tasks.map( task => {
  const emails = task.users.map( user => {
    return user_to_email(user); // from the database
  });
  return Promise.all(emails).then( emails => {
    task.emails = emails;
    return task;
  });
});
Promise.all(tasks_with_emails).then( tasks => {
  console.log(tasks); // <==== this one fires too quickly
});
setTimeout(() => console.log( '1000ms' ), 1000 );
setTimeout(() => console.log( '2000ms' ), 2000 );
setTimeout(() => console.log( '2999ms' ), 2999 );
...