Самый простой ответ - это ваше обещание, которое разрешает (return resolve(utlUrls)
) до того, как ваш асинхронный код (axios.get(...).then(...)
) завершится.
Это минимальный пример для воспроизведения вашей проблемы:
let timeout = ms => new Promise(resolve => setTimeout(() => resolve(ms), ms));
async function getLinks(urls) {
return new Promise((resolve, reject) => {
let ultUrls = [];
urls.forEach(url =>
timeout(500).then(res => ultUrls.push(res)))
return resolve(ultUrls);
});
}
getLinks([1, 2, 3]).then(a => console.log(a));
Это не работает, потому что мы возвращаем ultUrls до того, как заполним его. Мы не ждем завершения таймаутов.
Чтобы это исправить, просто дождитесь завершения обещаний, используя Promise.all
. Дополнительно удалив ненужную упаковку с обещаниями, получим:
let timeout = ms => new Promise(resolve => setTimeout(() => resolve(ms), ms));
function getLinks(urls) {
let ultUrls = [];
let promises = urls.map(url =>
timeout(500).then(res => ultUrls.push(res)))
return Promise.all(promises).then(a => ultUrls);
}
getLinks([1, 2, 3]).then(a => console.log(a));
Кроме того, если вы хотите использовать синтаксис async/await
, хотя он и не приносит вам большой выгоды в этом случае, когда у вас есть несколько параллельных запросов, вы можете написать его как:
let timeout = ms => new Promise(resolve => setTimeout(() => resolve(ms), ms));
async function getLinks(urls) {
let ultUrls = [];
let promises = urls.map(url =>
timeout(500).then(res => ultUrls.push(res)))
await Promise.all(promises);
return ultUrls;
}
getLinks([1, 2, 3]).then(a => console.log(a));