Карта Promise с массивом объектов с массивами - PullRequest
0 голосов
/ 16 мая 2018

У меня есть следующая структура данных:

[
  {
    "id": 1,
    "houses": [
      {
        "id": 1,
        "name": "house 1"
      },
      {
        "id": 2,
        "name": "house 2"
      }
    ]
  },
  {
    "id": 2,
    "houses": [
      {
        "id": 3,
        "name": "house 3"
      }
    ]
  }
]

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

sendWelcomeEmail(user, house)

Теперь я знаю, как использовать Promise.map в Bluebird, когда у меня есть массив обещаний, но в этом случае у меня есть массив объектов с массивами. Как правильно позвонить на Promise.map, чтобы я в итоге набрал sendWelcomeEmail для каждого пользователя и дома?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Promise.all

Метод Promise.all (iterable) возвращает одно Promise, которое разрешается, когда все обещания в итерируемом аргументе разрешены или когда итерируемый аргумент не содержит обещаний. Он отклоняет причину первого обещания, которое отклоняет.

const data = [{
    "id": 1,
    "houses": [{
        "id": 1,
        "name": "house 1"
      },
      {
        "id": 2,
        "name": "house 2"
      }
    ]
  },
  {
    "id": 2,
    "houses": [{
      "id": 3,
      "name": "house 3"
    }]
  }
];

const fakeSendWelcomeEmail = (id, house) => Promise.resolve(`${id} / ${house.name}`);

// Transforming the data into a flat array that contains the return value of fakeSendWelcomeEmail .
// So welcomeResults is an array of Promise.
const welcomeResults = data.reduce((res, user) => {
  return res.concat(user.houses.map((house) => {
    return fakeSendWelcomeEmail(user.id, house)
  }));
}, [])

Promise.all(welcomeResults)
  .then((results) => {
    console.log(results);
  })

Я сам написал Polyfill Promise , если вам интересно узнать, как все работает под капотом, или просто узнать немного больше об Promise.

0 голосов
/ 16 мая 2018

Вам нужно будет объединить уменьшение с картой.

const promises = mainArray.reduce((acc, cur) => {
  return acc.concat(cur.houses.map(house => sendWelcomeEmail(house)));
}, []);

обещания будут массивом с 3 обещаниями согласно вашему примеру.

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