получить данные из массива объектов, содержащих обещания - PullRequest
3 голосов
/ 16 июня 2020

В моем приложении для реагирования у меня есть идентификаторы пользователей, и мне нужно получить их электронные письма и имена с разных конечных точек, поэтому я делаю следующее:

const promises = ids.map(
   id => (  {email: axios.get(`blabla/${id}/email`), name: axios.get(`blabla/${id}/name`)}  )
);

, и он возвращает меня:

Теперь, чтобы получить данные, я делаю следующее:

  const results = [];
  promises.map(({ email, name}) =>
      Promise.all([email, name]).then((result) => {
        results.push({
          email: result[0].data,
          name: result[1].data,
        });
      })
    );

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

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Это нормально, за исключением того, что вы не используете массив, созданный map. Каждый раз, когда вы не используете возвращаемое значение map, используйте вместо него al oop (или forEach). Кроме того, каждый раз, когда вы пишете в массив, который закрываете из результатов асинхронной операции, он настраивает вас на случайное использование этого массива до того, как он будет заполнен.

Однако в этом случае я бы использовал массив map возвращает:

Promise.all(
    promises.map(({ email, name}) =>
        Promise.all([email, name])
        .then(([email, name]) => ({email, name}))
    )
).then(results => {
    // ...use results here, it's an array of {email, name} objects
})
.catch(error => {
    // ...handle error here, at least one operation failed...
});
1 голос
/ 16 июня 2020

Я бы сделал это вот так.

const promises = ids.map(
   id => (  [axios.get(`blabla/${id}/email`), axios.get(`blabla/${id}/name`)]  )
);
Promise.all(promises.map(Promise.all).then(
    ([email, name]) => {
        console.log(email, name)
    }
)).then(values => {
    console.log(values);
});
...