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);
  }
}

0 ответов

Другие вопросы по тегам