ES2018 Асинхронная итерация для await()
Я пытался написать пример, демонстрирующий проблему, которая for await (...)
решает. Однако, похоже, удалось написать асинхронный цикл без него, поэтому теперь я не понимаю, как продемонстрироватьfor await
:(
Пример без for await
async function process(array) {
console.log(
"This will not wait for the calls to resolves before triggering the next"
);
for (let i of array) {
let res = await mockAsync(i);
console.log(">>>", res);
}
}
let tab = [
"call 1.1",
"call 1.2",
"call 1.3",
];
await process(tab);
это выводит вызовы в правильном порядке:
text: call 1.1, timeout: 2500
resolve mockAsync callback: call 1.1 delayed for 2500
>>> callback mockAsync callback: call 1.1 delayed for 2500
text: call 1.2, timeout: 1500
resolve mockAsync callback: call 1.2 delayed for 1500
>>> callback mockAsync callback: call 1.2 delayed for 1500
text: call 1.3, timeout: 1000
resolve mockAsync callback: call 1.3 delayed for 1000
>>> callback mockAsync callback: call 1.3 delayed for 1000
пример использования for await
async function process3(array) {
console.log(
"This will wait for the calls to resolves before triggering the next"
);
for await (t of asyncGenerator(array)) {
console.log(">>>", t);
}
}
await process3([
"call 3.1",
"call 3.2",
"call 3.3",
]);
эта печать правильно ожидает завершения каждого асинхронного цикла
text: call 3.1, timeout: 1000
resolve mockAsync callback: call 3.1 delayed for 1000
>>> callback mockAsync callback: call 3.1 delayed for 1000
text: call 3.2, timeout: 500
resolve mockAsync callback: call 3.2 delayed for 500
>>> callback mockAsync callback: call 3.2 delayed for 500
text: call 3.3, timeout: 1500
resolve mockAsync callback: call 3.3 delayed for 1500
>>> callback mockAsync callback: call 3.3 delayed for 1500
Может ли кто-нибудь объяснить, что мне не хватает для демонстрации for await
правильно?
=====
Некоторые функции шаблонов для имитации асинхронных вызовов
function mockAsync(
text = "A log text",
timeout = Math.floor(Math.random() * 5 + 1) * 500
) {
console.log(`text: ${text}, timeout: ${timeout}`);
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log(`resolve mockAsync callback: ${text} delayed for ${timeout}`);
resolve(`callback mockAsync callback: ${text} delayed for ${timeout}`);
}, timeout);
});
}
async function* asyncGenerator(array) {
for (item of array) {
yield mockAsync(item);
}
}