Node.js: кажется, что асинхронная функция не ожидает разрешения Promise внутри цикла for - PullRequest
1 голос
/ 12 марта 2019

Для цикла заканчивается без кода после первого выполнения await new Promise.Если я правильно понимаю, каждая итерация должна быть приостановлена ​​на 2 секунды, прежде чем Promise разрешается, console.log выводит указанную строку и итерация заканчивается.Как мне переписать код, чтобы он работал так, как я задумал?

'use strict';

(async function () {
    for (let i = 0; i < 5; i++) {
        await new Promise(resolve => { setTimeout(() => { resolve }, 2000) });
        console.log('end of loop');
    }
})();

Ответы [ 3 ]

1 голос
/ 12 марта 2019

Вы можете написать так,

'use strict';

var wait2Sec = function (time = 2000) {
    return new Promise(function (resolve, reject) {
        setTimeout(() => { 
            resolve(); // <--- remamber to call the resolve function
        }, time)
    });
}

(async function () {
    for (let i = 0; i < 5; i++) {
        await wait2Sec();
        console.log('end of loop');
    }
})();
0 голосов
/ 12 марта 2019

вам нужно вызвать функцию разрешения в вашем обратном вызове setInterval.

await new Promise(resolve => { setTimeout(() => { resolve() }, 2000) });
0 голосов
/ 12 марта 2019

В вашем фрагменте setTimeout вызовет анонимную функцию, которая оценит resolve как выражение, возвращающее функцию. Вам необходимо явно вызвать resolve() или передать его setTimeout в качестве первого аргумента типа function.

Изменение

setTimeout(() => { resolve }, 2000)

до

setTimeout(resolve, 2000)

или

setTimeout(() => { resolve() }, 2000)
...