Promise with setTimeout - непонятна работа в цикле

Рейтинг: 1Ответов: 2Опубликовано: 18.01.2023

Пытаюсь добиться последовательного выполнения внутри цикла

async function f(){
    for (let index = 0; index < 3; index++) {
        await new Promise(r => setTimeout(()=>{console.log("f")}, 2000));
        console.log(index)
    }
}
f();
// Результат выводит один раз f

Как добиться вывода?

f
0
f
1
f
2

Ответы

▲ 4Принят

Надо не забывать, что промис должен быть либо разрешён (resolve) либо отклонён (reject). У вас нет как минимум одной этой важной детали.

async function f(){
    for (let index = 0; index < 3; index++) {
        let promise = new Promise((resolve, reject) => {
            setTimeout(() => resolve("f"), 1000)
        });
        
        let result = await promise;
        console.log(result)
        console.log(index)
    }
}
f();


async function f(){
    for (let index = 0; index < 3; index++) {
        await new Promise((resolve, reject) => {
            setTimeout(() => {
              console.log('f');
              resolve();
            }, 1000)
        });
        
        console.log(index)
    }
}
f();

▲ 1

почему без создания переменной let promise, await не работал?

Он просто не заканчивался. В нем не вызывался ни resolve, ни reject

Вот - все работает и без переменной.

async function f(){
    for (let index = 0; index < 3; index++) {
        await new Promise(resolve => setTimeout(_ => {
          console.log("f")
          resolve()
        }, 2000));
        console.log(index)
    }
}
f();