为 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...
}
但是,如果迭代器实现 return
和 throw
我不确定 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
方法:
- 当迭代变量赋值或循环体抛出异常时
- 当循环体计算
return
、break
或 continue outer_label
语句时
AsyncIteratorClose procedure的步骤很难准确地表示为 JS 代码,所以我将避免尝试去糖化。
for await … of
步骤与 for … of
循环完全相同,除了通过 Symbol.asyncIterator
而不是 Symbol.iterator
和 await
ing 访问迭代器.next()
和 .return()
调用的 return 值。
一直在努力弄清楚 for await .. of
到底是做什么的。然而,即使阅读了规格,我也无法确切地找到它的作用。
这是我的猜测:
const it = iterable[Synbol.asyncIterator]();
while (true) {
const { done, value } = await it.next();
if (done) return;
// User code...
}
但是,如果迭代器实现 return
和 throw
我不确定 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
方法:
- 当迭代变量赋值或循环体抛出异常时
- 当循环体计算
return
、break
或continue outer_label
语句时
AsyncIteratorClose procedure的步骤很难准确地表示为 JS 代码,所以我将避免尝试去糖化。
for await … of
步骤与 for … of
循环完全相同,除了通过 Symbol.asyncIterator
而不是 Symbol.iterator
和 await
ing 访问迭代器.next()
和 .return()
调用的 return 值。