ES2018 Асинхронная итерация 'для await ()' - PullRequest
0 голосов
/ 31 октября 2019

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