Если вы хотите, чтобы loop
зациклился асинхронно, сделайте что-то асинхронное в цикле.async
функция выполняется синхронно вплоть до первого await
(или когда она возвращается), после чего она возвращает обещание о ее завершении.
Асинхронные циклы иногда хорошо моделируютсякак функции асинхронного генератора:
function somethingAsync(value) {
return new Promise(resolve => {
setTimeout(() => {
resolve(value);
}, Math.random() * 50);
});
}
async function* loop() {
let i = 0;
while (i < 10) { // made it 10 instead of 10000
yield somethingAsync(i++);
}
console.log('step 2');
}
console.log('step 1');
const gen = loop();
console.log('step 3');
(async () => {
for await (const value of gen) {
console.log(value);
}
})();
Там генератор выдает обещание следующего значения (очевидно, somethingAsync
является заполнителем для чего-то, что на самом деле что-то делает, а не просто возвращает значение после задержки).Использование for-await-of
позволяет циклически выполнять значения выполнения обещаний, которые возвращает генератор.