Другие ответы довольно подробно рассказали о том, как ведут себя ваши примеры, но я хотел попробовать , чтобы изложить его более кратко.
const resultsPromises = myArray.map(async number => {
return await getResult(number);
});
const resultsPromises = myArray.map(number => {
return getResult(number);
});
Array.prototype.map
синхронно проходит через массив и преобразует каждый элемент в возвращаемое значение его обратного вызова.
Оба примера возвращают Promise
.
async
функции всегда возвращают Promise
.
getResult
возвращает Promise
.
Поэтому, если нет ошибок, вы можете рассматривать их в псевдокоде как:
const resultsPromises = myArray.map(/* map each element to a Promise */);
Как указано zero298 и alnitak продемонстрировал , это очень быстро (синхронно) запускает каждое обещание по порядку;однако, поскольку они выполняются параллельно, каждое обещание будет разрешено / отклонено по своему усмотрению и, скорее всего, не будет выполнено (выполнено или отклонено) по порядку.
Либо выполните обещания параллельнои собрать результаты с помощью Promise.all
или запустить их последовательно, используя for * loop или Array.prototype.reduce
.
В качестве альтернативы, вы можетеиспользуйте сторонний модуль для цепных асинхронных методов JavaScript Я поддерживаю, чтобы очистить вещи и - возможно - сделать так, чтобы код соответствовал вашей интуиции того, как может работать операция асинхронная карта :
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
const getResult = async n => {
await delay(Math.random() * 1000);
console.log(n);
return n;
};
(async () => {
console.log('parallel:');
await AsyncAF([1, 2, 3]).map(getResult).then(console.log);
console.log('sequential:');
await AsyncAF([1, 2, 3]).series.map(getResult).then(console.log)
})();
<script src="https://unpkg.com/async-af@7.0.12/index.js"></script>