讨价还价等待..的

时间:2020-01-11 19:11:36

标签: javascript async-await for-await

一直在尝试弄清楚for await .. of的作用。但是,即使阅读规范,我也无法确切找到它的作用。

这是我的猜测:

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

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

一个猜测是:

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

1 个答案:

答案 0 :(得分:1)

在迭代协议中根本不使用迭代器的throw方法。

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

  • 当对迭代变量或循环体的赋值引发异常时
  • 当循环主体评估returnbreakcontinue outer_label语句时

AsyncIteratorClose procedure的步骤确实很难准确地表示为JS代码,因此,我将避免尝试废止。

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

相关问题