@ Берги ответ правильный, однако я бы хотел немного его расширить и дать вам некоторые ресурсы, чтобы увеличить или укрепить свои Promises
знания. Я буду использовать следующий фрагмент кода, он немного громоздкий, потому что я написал его на Google Chrome
фрагментах, поэтому не стесняйтесь вставлять его туда и поиграть с ним:
(function() {
const promise1 = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('Replicant');
}, 300);
});
const promise2 = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('Human?');
}, 300);
});
function buildFile(type) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`${type}`);
}, 300);
});
}
function sendMail(customer, answer) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`Sent test to: ${customer}, he/she is a ${answer}`);
}, 300);
});
}
let customers = ['Rob Batty', 'Rachel', 'Deckard'];
async function myFunc() {
const [a, b, c] = await Promise.all([promise1, promise1, promise2]);
const answers = [a, b, c];
// const promises = customers.map(async (name, index) => {
// const file = await buildFile(answers[index]);
// const mail = await sendMail(name, file);
// console.log(mail);
// });
const promises = customers.map((name, index) => {
buildFile(answers[index])
.then(file => sendMail(name, file))
.then(sent => console.log(sent))
// If you're going to use Promises this is important! :D
.catch(err => console.log(err))
});
const [m1, m2, m3] = await Promise.all(promises);
console.log(m1, m2, m3);
}
myFunc();
})()
Как указано в ответе, проблема связана с использованием forEach
, почему? Ну, просто потому, что вы выполняете код asynchronous
для метода типа synchronous
, вы не очень хорошо ладите :), поэтому решение состоит в том, чтобы создать Array
из Promises
, как Factory
. После функции map
Promises
равны Pending
или Fullfiled
или Rejected
. Когда вы вызываете метод Promise.all()
, вы ожидаете его результатов, и они дают вам значения или в вашем случае использования генерируют файл, а затем отправить электронное письмо пользователю. Я надеюсь, что это поможет вам лучше понять, как работает Promises
. В конце я оставлю две очень важные ссылки, по крайней мере для меня, которые помогли мне в какой-то момент с Promises
. Ура, Зигфрид.