MDN有一个示例,其中生成器功能标记为async
,yield
不带时使用await
。
为什么await
在此示例中没有必要?
const myAsyncIterable = {
async* [Symbol.asyncIterator]() {
yield "hello"
yield "async"
yield "iteration!"
}
}
仅仅因为一个函数async
并不意味着await
是必需的。我认为该示例async
仅表明您可以轻松地将await
ed Promise插入其中。
有什么Symbol.asyncIterator
可以异步遍历如果需要的话,但它不具有有任何异步操作。您甚至可以在Symbol.asyncIterator
属性上用标准生成器函数替换异步函数,并且仍然可以正常工作:
const myAsyncIterable = {
*[Symbol.asyncIterator]() {
yield "hello"
yield "async"
yield "iteration!"
}
};
(async () => {
for await (const item of myAsyncIterable) {
console.log(item);
}
})();
查看规范,从对象检索迭代器之后,迭代器是同步还是异步都没有关系。异步生成器函数将导致异步迭代器;同步生成器功能将导致同步迭代器。见规格的最后一个步骤7这里- GetIterator将被调用,不管对象是在Symbol.asyncIterator
将被退回,如果存在的话,不考虑它是否真的异步与否的。
随着迭代器,当与遍历for await
,由迭代返回的每个值将被await
编:
b。如果iteratorKind是异步的,则将nextResult设置为?
Await(nextResult)
。
对于await
不是Promise的东西来说,这是完全可以的,这很奇怪:
(async () => {
const item = await 'foo';
console.log(item);
})();
await
如果右边的表达式是Promise,将解开Promise,否则将保持不变。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句