Javascript 用于与同步iterables一起等待…的

Javascript 用于与同步iterables一起等待…的,javascript,async-await,Javascript,Async Await,用于wait…of的MDN有两个用例: wait…of语句的创建了一个在异步上迭代的循环 iterable对象以及同步iterables 我以前知道前者:使用Symbol.asyncierator的异步iterables。但我现在对后者感兴趣:同步可重用性 下面的代码迭代一个同步iterable—一个承诺数组。它似乎阻碍了每个承诺的实现 async函数async函数(){ 试一试{ const happy=新承诺((解析)=>setTimeout(()=>resolve('happy'),10

用于wait…of的MDN
有两个用例:

wait…of
语句的
创建了一个在异步上迭代的循环
iterable对象以及同步iterables

我以前知道前者:使用
Symbol.asyncierator
的异步iterables。但我现在对后者感兴趣:同步可重用性

下面的代码迭代一个同步iterable—一个承诺数组。它似乎阻碍了每个承诺的实现

async函数async函数(){
试一试{
const happy=新承诺((解析)=>setTimeout(()=>resolve('happy'),1000))
const sad=new Promise((uu,reject)=>setTimeout(()=>reject('sad'))
康斯特承诺=[快乐,悲伤]
等待(持续承诺项目){
console.log(项目)
}
}捕捉(错误){
log(`发生错误:`,err)
}
}

asyncFunction()/“happy,发生了一个错误:sad”(快速连续打印,大约5秒后)
sad
承诺失败时,它没有被
wait
拒绝-代码需要等待
happy
完成,然后才能开始等待
sad
sad
承诺在
happy
解决之前就失败了。(
Promise.all
是一个更适合此用例的工具)

是的,这很奇怪,您不应该这样做。不要重复承诺的数组,这会导致错误。(另见。)

那么,为什么语言支持这一点呢?继续使用草率的承诺语义

您可以在以下内容中找到确切的理由:

我认为我们应该回到
Symbol.iterator
,因为我们当前的 承诺语义都是关于允许将同步内容用作 异步的东西。你可以称之为“草率”。接下来 , 但我只想更详细地解释这些相似之处

的“链接”语义就是关于这一点的。你可以退票
来自
的承诺。然后
或标量值;都一样。你打电话
承诺。下定决心
不要用承诺来包装某件事,而要用承诺来表达 承诺的东西——当你有 什么的

async
await
的语义也都是草率的。 可以对异步函数中的任何非承诺表达式使用
wait
一切都很好,完全一样,只是你屈服了 控件添加到作业队列。类似地,您可以“防御地”将
async
无论你想要什么,只要你等待结果。如果你有 一个返回承诺的函数——不管怎样!你可以做一个
async
函数,并且从用户的角度来看,没有任何变化(甚至 如果,从技术上讲,你得到了一个不同的承诺对象)

异步迭代器和生成器的工作方式应该相同。就像你一样 可以等待一个值,意外地,不是一个承诺,一个合理的 用户希望能够
yield*
async中的同步迭代器 发电机<代码>对于等待
循环,如果用户 防守上也有这样的圈套,认为他们可能是 获取异步迭代器

我认为打破所有这些相似之处将是一件大事。信息技术 会使异步迭代器不那么符合人体工程学。让我们下次再讨论这个问题 时间异步生成器/迭代器出现在TC39的议程上


你的问题到底是什么?您提供的示例似乎是我对wait的
的描述。。。对于同步iterables,是正确的,如果是,该模式会发出未处理的拒绝错误是否重要?“是否正确”不是问题。“正确”就是你所说的。你能通过代码演示你所描述的未处理拒绝错误的发出吗?最终的代码演示了它。Correct在本文中有一个定义良好的含义,因为我提供了代码来描述我认为它在做什么。如果行为与我的代码匹配,那么我的代码是正确的,否则我的理解是错误的。而且,无论你说什么,观察“正确”都是正确的。这显然是不真实的。在这种情况下,Correct有明确的含义。我知道。这就是我的问题。如果
Promise.all
是一个更好的解决方案,那么该语言为什么适合这种语法<代码>for await…of
可以很容易地实现,以简单地枚举异步可重用项。但是他们迎合了它去列举同步的可重用性(但是有一个(似乎?)陷阱)。为什么?啊,我误解了。我们是在问为什么等待。。。of
是否接受同步可编程项?我想支持异步生成器,它可以有条件地返回同步项。是的,特别是考虑到它似乎引入了拒绝连接陷阱。在我看来,陷阱通常是创建承诺,而不是立即等待承诺。不幸的是,这个陷阱通常也是一个非常有用的特性。谢谢。是否发出事件,或者它实际上是某种其他类型的错误?我这样问是因为我认为事件是WebAPI的一部分。在规范的其他部分中,事件的发射是否以类似的方式使用?@52d6c6af您指的是
未处理的发射
事件吗?是的。只是为了截获“错误”,我使用了
窗口。addEventListener('unhandledrejection',…
简而言之:这是我能想到的JavaScript发出这种错误的唯一例子。然而,我几乎肯定错了。最后,这个“错误”的发出除了控制台中有一条不需要的错误消息之外,还有什么真正重要的吗?@52d6c6af请参阅和,了解如何在ECMAScript和Web API规范的联合工作中指定此消息。不,事件并不重要,当您收到此消息时已经太晚了。Afaics,它仅用于moni