为 await .. 脱糖

desugaring for await .. of

一直在努力弄清楚 for await .. of 到底是做什么的。然而,即使阅读了规格,我也无法确切地找到它的作用。

这是我的猜测:

const it = iterable[Synbol.asyncIterator]();
while (true) {
  const { done, value } = await it.next();
  if (done) return;
  // User code...
}

但是,如果迭代器实现 returnthrow 我不确定 where/how 它们是否起作用?

一个猜测是:

const it = iterable[Synbol.asyncIterator]();
try {
  while (true) {
    const { done, value } = await it.next();
    if (done) return;
    try { 
      // User code...
    } catch (err) {
      const { done } = await it.throw(err);
      if (done) return;
    }
  }
} finally {
  it.return();
}

在迭代协议中完全没有使用迭代器的throw方法。

如果用户代码评估为提前结束迭代的突然完成(即在 (await it.next()).done 之前是 true),则调用迭代器的 return 方法:

  • 当迭代变量赋值或循环体抛出异常时
  • 当循环体计算 returnbreakcontinue outer_label 语句时

AsyncIteratorClose procedure的步骤很难准确地表示为 JS 代码,所以我将避免尝试去糖化。

for await … of 步骤与 for … of 循环完全相同,除了通过 Symbol.asyncIterator 而不是 Symbol.iteratorawaiting 访问迭代器.next().return() 调用的 return 值。