Код в вашем вопросе выглядит примерно так:
(async function get() {
try {
console.time("get");
console.log(JSON.stringify(await getPersonData()));
console.timeEnd("get");
} catch (e) {
console.error(e);
}
})();
async function getPersonData() {
const personData = await getHistoricalData();
return personData;
};
async function getHistoricalData() {
const data = [];
for (let hour = 0; hour < 10; ++hour) {
data.push(await getOneHourOfData());
}
return data;
}
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
let num = 0;
async function getOneHourOfData() {
await delay(150);
return ++num;
}
Для запуска требуется около 1500 мс.
Это то же самое, что делать 10-часовые вызовы параллельно и использовать Promise.all
:
(async function get() {
try {
console.time("get");
console.log(JSON.stringify(await getPersonData()));
console.timeEnd("get");
} catch (e) {
console.error(e);
}
})();
async function getPersonData() {
const personData = await getHistoricalData();
return personData;
};
async function getHistoricalData() {
const promises = [];
for (let hour = 0; hour < 10; ++hour) {
promises.push(getOneHourOfData()); // <== No `await`!
}
return Promise.all(promises); // <== `await `on this line is optional but
// pointless, this is an `async`
// function, so its promise will be
// resolved to the promise we return
}
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
let num = 0;
async function getOneHourOfData() {
await delay(150);
return ++num;
}
Он работает примерно за 150 мс, потому что 10 вызовов исторических данных происходят параллельно. Обратите внимание, что главное - создать массив обещаний (без await
их), а затем использовать Promise.all
, чтобы получить одно обещание для всего этого массива обещаний.