Syntax

async function f() {
  for await (const x of createAsyncIterable(["a", "b"])) {
    console.log(x);
  }
}
// Output:
// a
// b

Rejections

Like await in async functions, th eloop throws an exception if next() returns a rejection:

function createRejectingIterable() {
  return {
    [Symbol.asyncIterator]() {
      return this;
    },
    next() {
      return Promise.reject(new Error("Problem!"));
    },
  };
}
(async function () {
  // (A)
  try {
    for await (const x of createRejectingIterable()) {
      console.log(x);
    }
  } catch (e) {
    console.error(e);
    // Error: Problem!
  }
})(); // (B)