как вернуть масив с результатом вызова промисов?
Нужно написать асинхронную функцию PromiseAll, которая принимает массив промисов и возвращает массив результатов вызова этих промисов. Без использования метода promise.All Пример:
const firstPromise = new Promise((resolve) =>
setTimeout(() => resolve(300), 300)
);
const secondPromise = new Promise((resolve) =>
setTimeout(() => resolve(200), 200)
);
const thirdPromise = new Promise((resolve) =>
setTimeout(() => resolve(100), 100)
);
promiseAll([firstPromise, secondPromise, thirdPromise])
.then(console.log); // [300, 200, 100]
Ответы (2 шт):
Автор решения: Grundy
→ Ссылка
Promise.all- возвращает новый Promise.- Разрешается новый Promise - в момент, когда решились все переданные Promise.
- Если хотя бы один из переданных Promise отклонился, то и новый Promise так же отклоняется.
Исходя из этого можно построить следующую функцию:
function promiseAll(promises) {
var count = promises.length; // количество ожидаемых Promise
var result = new Array(count); // результат
return new Promise((resolve, reject) => {
for (let i = 0; i < promises.length; i++) {
promises[i].then(val => { // если Promise решен
result[i] = val; // сохраняем результа
if (--count == 0) { // если больше нечего ждать
resolve(result); // возвращаем результат
}
}, (err) => reject(err)); // если ошибка - прерываем основной Promise
}
});
}
const firstPromise = new Promise((resolve) =>
setTimeout(() => resolve(300), 300)
);
const secondPromise = new Promise((resolve) =>
setTimeout(() => resolve(200), 2000)
);
const thirdPromise = new Promise((resolve) =>
setTimeout(() => resolve(100), 100)
);
promiseAll([firstPromise, secondPromise, thirdPromise])
.then(console.log); // [300, 200, 100]
Автор решения: entithat
→ Ссылка
const firstPromise = new Promise((resolve) =>
setTimeout(() => resolve(300), 300)
);
const secondPromise = new Promise((resolve) =>
setTimeout(() => resolve(200), 200)
);
const thirdPromise = new Promise((resolve) =>
setTimeout(() => resolve(100), 100)
);
function promiseAll(arr) {
if (arr.length === 0) return Promise.resolve([]);
const copy = [...arr]; // делаем копию, чтобы не изменить исходящий массив
return new Promise((resolve, reject) => {
let count = 0;
for (let i = 0; i < arr.length; i++) {
arr[i].then(res => {
copy[i] = res;
if (++count === arr.length) resolve(copy);
}).catch(err => reject(err));
}
});
}
promiseAll([firstPromise, secondPromise, thirdPromise])
.then(console.log) // [300, 200, 100]
promiseAll([])
.then(console.log) // []
.catch(console.log);