Вам также необходимо поместить цикл for
в функцию async
, чтобы вы могли await
каждый вызов startFunc
:
function callToDB(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function startFunc (i) {
console.log('start', i);
await callToDB(1000);
console.log('end', i);
}
(async () => {
for (let i = 0; i < 5; i++) {
await startFunc(i);
}
})();
Другим методом будет непрерывное связывание .then
s:
function callToDB(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function startFunc (i) {
console.log('start', i);
await callToDB(1000);
console.log('end', i);
}
let prom = Promise.resolve();
for (let i = 0; i < 5; i++) {
prom = prom.then(() => startFunc(i));
}
Или вы можете использовать .reduce
и постоянно передавать последнее Обещание в качестве аккумулятора, а не назначать внешнюю переменную:
function callToDB(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function startFunc (i) {
console.log('start', i);
await callToDB(1000);
console.log('end', i);
}
const finalProm = Array.from({ length: 5 })
.reduce(
(lastProm, _, i) => lastProm.then(() => startFunc(i)),
Promise.resolve()
);