Я пытался написать пример, который демонстрирует проблему, которую 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);
}
}