0

一直在试图弄清楚到底是做什么for await .. of的。但是,即使阅读规格,我也无法准确找到它的作用。

这是我的猜测:

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

但是,如果迭代器实现return并且throw我不确定它们在哪里/如何发挥作用?

一种猜测是:

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

1 回答 1

1

throw迭代协议中根本没有用到迭代器的方法。

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

  • 当对迭代变量或循环体的赋值抛出异常时
  • 当循环体计算return, breakorcontinue outer_label语句时

AsyncIteratorClose过程的步骤确实很难准确地表示为 JS 代码,因此我将避免尝试去糖。

这些for await … of步骤与循环的步骤完全相同for … of,除了通过Symbol.asyncIterator代替来访问迭代器Symbol.iterator,以及ing和调用await的返回值。.next().return()

于 2020-01-13T19:50:40.843 回答