一直在尝试弄清楚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();
}
答案 0 :(得分:1)
在迭代协议中根本不使用迭代器的throw
方法。
如果用户代码评估为突然结束迭代(即return
为(await it.next()).done
之前)的突然完成,则调用迭代器的true
方法:
return
,break
或continue outer_label
语句时AsyncIteratorClose procedure的步骤确实很难准确地表示为JS代码,因此,我将避免尝试废止。
for await … of
步骤与for … of
循环完全相同,除了通过Symbol.asyncIterator
而不是Symbol.iterator
访问迭代器,并通过await
进行返回.next()
和.return()
调用的值。