将 for wait...of 与同步迭代一起使用

2024-01-11

MDN says https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of for await...of有两个用例:

The for await...of语句创建一个循环迭代 async 可迭代对象以及同步可迭代对象,...

我之前知道前者:使用异步迭代Symbol.asyncIterator。但我现在对后者感兴趣:同步迭代。

以下代码迭代同步可迭代对象 - 一个 Promise 数组。它似乎阻碍了每项承诺的履行进程。

async function asyncFunction() {
    try {
        const happy = new Promise((resolve)=>setTimeout(()=>resolve('happy'), 1000))
        const sad = new Promise((_,reject)=>setTimeout(()=>reject('sad')))
        const promises = [happy, sad]
        for await(const item of promises) {
            console.log(item)
        }
    } catch (err) {
        console.log(`an error occurred:`, err)
    }
}

asyncFunction() // "happy, an error occurred: sad" (printed in quick succession, after about 5 seconds)

根据下面所示的逻辑,该行为似乎类似于依次等待每个承诺。这个说法正确吗?

async function asyncFunction() {
    try {
        const happy = new Promise((resolve)=>setTimeout(()=>resolve('happy'), 1000))
        const sad = new Promise((_,reject)=>setTimeout(()=>reject('sad')))
        const promises = [happy, sad]
        for(let p of promises) {
            const item = await p
            console.log(item)
        }
    } catch (err) {
        console.log(`an error occurred:`, err)
    }
}

asyncFunction() // "happy, an error occurred: sad" (printed in quick succession, after about 5 seconds)

我问这个问题是因为这种代码模式有一个隐式拒绝接线陷阱Promise.all and Promise.allSettled避免,对我来说奇怪的是该语言明确支持这种模式。

window.addEventListener('unhandledrejection', () => {
  console.log('unhandled rejection; `sad` was not being awaited at the time it rejected')
})

async function asyncFunction() {
    try {
        const happy = new Promise((resolve)=>setTimeout(()=>resolve('success'), 1000))
        const sad = new Promise((_,reject)=>setTimeout(()=>reject('failure')))
        const promises = [happy, sad]
        for(let p of promises) {
            const item = await p
            console.log(item)
        }
    } catch (err) {
        console.log(`an error occurred:`, err)
    }
}

asyncFunction() // "unhandled rejection; `sad` was not being awaited at the time it rejected" (after about zero seconds), and then "happy, an error occurred: sad" (printed in quick succession, after about 5 seconds)

是的,这很奇怪,你不应该这样做。不要重复一系列的承诺,它会导致正是针对您提到的未处理的拒绝问题 https://stackoverflow.com/q/46889290/1048572。 (也可以看看这个更具体的解释 https://stackoverflow.com/a/59695815/10485.)

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

您可以在中找到确切的推理讨论提案这一部分的问题的评论 https://github.com/tc39/proposal-async-iteration/issues/12#issuecomment-246403264:

我认为我们应该回到Symbol.iterator因为我们当前的 Promise 语义就是允许同步事物被用作 异步的事情。你可以称之为“草率”。它跟随@groundwater上面的逻辑 https://github.com/tc39/proposal-async-iteration/issues/12#issuecomment-157209898, 但我只是想更详细地阐明两者的相似之处。

“链接”语义.then都是关于这个的。您可以返回一个 承诺来自.then或标量值;全部都是一样。你打电话Promise.resolve不是将某些东西包装在 Promise 中,而是进行投射 Promise 的某物——当你有时获取一个异步值 某事或其他。

的语义async and await都是关于马虎的。 你可以打巴掌await在异步函数中的任何非 Promise 表达式上 一切都工作正常,完全一样的方式,除了你屈服 控制作业队列。同样,你可以“防御性”地放置async围绕着你想要的一切,只要你await结果。如果你有 一个返回 Promise 的函数——无论如何!你可以把它变成async功能,并且从用户的角度来看,没有任何变化(甚至 如果从技术上讲,你得到了一个不同的 Promise 对象)。

异步迭代器和生成器应该以相同的方式工作。就像你一样 可以等待一个意外地不是 Promise 的值,一个合理的值 用户希望能够yield*异步中的同步迭代器 发电机。for await循环应该类似地“正常工作”,如果用户 以这种方式防御性地标记一个循环,认为他们可能会 获取异步迭代器。

我认为打破所有这些相似之处将是一件大事。它 会使异步迭代器不太符合人体工程学。我们接下来讨论这个 时间异步生成器/迭代器出现在 TC39 的议程上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 for wait...of 与同步迭代一起使用 的相关文章

  • 异步尝试(blah)模式[重复]

    这个问题在这里已经有答案了 我正在寻找有关如何处理以下情况的建议 我正在创建尝试获取某些数据的方法 遵循以下模式 Typical pattern public bool TryBlah string key out object value
  • jQuery 可以操作插入的元素吗?

    我是 jQuery 的新手 我认为 jQuery 可以操作由代码添加的元素是合理的 但我发现现在还不能 function addVideo click function publisher append div div
  • 如何在 google.maps.event.addListener 中使用它

    以下示例有效 但是当我尝试传递参数并使用this在该功能不起作用 Working google maps event addListener markers i click showInfoWindow function showInfoW
  • 需要参数的addEventListener(和removeEventListener)函数

    我需要向 8 个对象 手掌 添加一些侦听器 这些对象是相同的 但行为必须根据它们的位置而改变 我有以下 丑陋的 代码 root palmsStatus B B B B B B B B if root palmsStatus 0 N root
  • 如何设置必须输入特定数字的字段?

    我想知道如何创建一个需要输入特定数字或文本的字段 例如 激活码 以及在输入的确认答案的情况下移动到 网页 并且在未确认的情况下移动到 另一页面 的按钮 使用必需的属性
  • Node.js Express 4.0 中的 res.render 回调参数的用途是什么?

    目的是什么res render回调参数 在什么情况下 由于模板已被指定为第一个参数 因此人们会想要使用这样的回调参数 这是文档中的代码 send the rendered view to the client res render inde
  • 如何在 JavaScript 中将变量的内容写入文件[重复]

    这个问题在这里已经有答案了 可能的重复 firefox 如何启用本地 JavaScript 来读取 写入我的 PC 上的文件 https stackoverflow com questions 2846045 firefox how to
  • 为什么函数声明在不同浏览器中的处理方式不同?

    虽然我在谷歌中找不到对此的引用 但我熟悉这样一个事实 在 javascript 中 全局函数声明在执行任何代码之前都会被解释 换句话说 这工作得很好 f function f 但是 我注意到 chrome 和 firefox 对全局函数声明
  • 非法使用break语句; javascript

    当这个变量达到一定数量时 我希望循环停止 但我不断收到错误 未捕获的语法错误 非法的中断语句 function loop if isPlaying jet1 draw drawAllEnemies requestAnimFrame loop
  • 函数不会等到 Promise 得到解决

    我正在开发一个简单的不和谐机器人 我正在尝试打印有关某个玩家的一些一般数据 我最近了解了 async await 并尝试将其实现到我的代码中 然而 它似乎不起作用 因为当我第一次触发此代码时 它会打印 null 但在后续触发时 它将打印正确
  • Socket IO 服务器到服务器

    服务器是否可以使用 Socket IO 连接到另一个服务器并被视为客户端 并让它加入房间 接收 io sockets in lobby emit 和更多 第一个服务器也在监听连接 消息 嘿 Brad 下面是我的完整 js 应用程序 供参考
  • Riak 在 MapReduce 查询中失败。使用哪种配置?

    我正在与 riak riak js 结合开发一个 nodejs 应用程序 并遇到以下问题 运行此请求 db mapreduce add logs run 正确返回存储在存储桶日志中的所有 155 000 个项目及其 ID logs 1GXt
  • D3 向对象添加超链接?

    我正在尝试制作 D3 图 它将代表我网站的菜单 我尝试按照此处的其他指南添加超链接 但它们都不起作用 每个对象都会有一个不同的 URL 指向 主页 关于 联系方式等 如果添加超链接 我可以拖动对象吗 这意味着如果我按住单击 如果我单击该对象
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 如何使用 GreaseMonkey 让浏览器恢复“/”键?

    Lots of web pages seem to use the key for searching I d like to disable that because 100 of the time I want to use to se
  • jQuery 中什么函数相当于 .SelectMany()?

    让我解释一下 我们知道 jQuery 中的映射函数充当 Select 如 LINQ 中 tr map function return this children first returns 20 tds 现在的问题是我们如何在 jQuery
  • 在 Nodejs 中,如何停止 FOR 循环直到 MongoDB 调用返回

    我正在研究下面的代码片段 我有一个名为 stuObjList 的 JSON 对象数组 我想循环遍历数组以查找具有特定标志集的特定 JSON 对象 然后进行数据库调用以检索更多数据 当然 FOR 循环不会等待数据库调用返回并到达 j leng
  • 在 React Web 应用程序中使用 createjs-soundjs

    我想用https www npmjs com package createjs soundjs https www npmjs com package createjs soundjs在 React Web 应用程序上播放声音 我正常安装了
  • 如何获取符号名称(文字)?

    以下情况 var myVehicle brand Tesla var isMoving Symbol var currentStatus Symbol myVehicle isMoving true myVehicle currentSta
  • Chrome 调试器注入 javascript

    我有这样的好奇心 是否可以以某种方式在我的页面中注入 javascript 并执行它并调试它 正如您在控制台中所做的那样 但在控制台中您无法暂停并观察变量 是否可以调试我通过控制台输入的代码 为什么无法调试通过 XHR 接收的代码 Than

随机推荐

  • 2条正态曲线的交点

    虽然我认为这是一个基本问题 但我似乎无法找出如何在 R 中计算它 2 个或多个正态分布 拟合在直方图上 的交点 我需要 x 值 例如具有以下参数 d data frame mod c 1 2 mean c 14 16 sd c 0 9 0
  • 有没有办法仅针对其副作用来应用重构脚本?

    我有一个库已更改为引入工厂方法来替换构造函数 原因现在并不重要 在当前情况下主要是为了改进类型推断 假设有is一个 Eclipse 重构脚本 所以我几乎有一个很好的计算机可读的更改描述 有什么方法可以apply该脚本仅适用于项目uses那个
  • IE8 - 带有 margin-top 的容器:10px 没有边距

    编辑 这只发生在 IE8 中 在 IE7 Firefox Opera 等中工作正常 首先 这是我在 Photoshop 中制作的一张图片来演示我的问题 http richardknop com pict jpg http richardkn
  • 调整 2D numpy 数组的大小(不包括 NaN)

    我正在尝试调整给定因子的 2D numpy 数组的大小 从而在输出中获得更小的数组 该数组是从图像文件中读取的 其中一些值应该是 NaN 不是数字 来自 numpy 的 np nan 它是卫星遥感测量的结果 只是没有测量 一些像素 我为此找
  • Gnuplot 不同颜色

    我试图用不同的颜色为绘图和 gnuplot 中的拟合着色 但它不起作用 set ylabel s in m set xlabel t in s unset key set style line 1 lt 2 lc rgb red lw 3
  • 在 Flutter 应用程序中使用 Stripe 保持 PCI 合规性

    我正在将 Stripe 集成为支付网关 并且我正在考虑flutter stripe包装上写着 简化安全性 我们让您可以轻松收集信用卡号等敏感数据并保持 PCI 合规性 这意味着敏感数据将直接发送到 Stripe 而不是通过您的服务器 有关更
  • 当 char * 被类型定义并通过结构访问时,为什么编译器会看到 char * 和 printf 的转换说明符“s”不匹配?

    为什么编译器会抱怨以下 printf 中的参数类型 char 和转换说明符 s 不匹配 include
  • 将 MySQL 数据库拆分为单独的表

    嗯 我不是一个优秀的开发人员或数据库专家 但我对这些事情还是有一点了解的 我正在尝试使用 mysqldump 命令在 VPS 上转储数据库 该命令运行良好 但是 当我在下载转储后尝试在本地恢复时 出现超时错误 任何人都可以告诉我如何通过将数
  • 如何强制PHP/Apache再使用一年?

    因此 另一位员工交给了我一个旧项目 它的代码非常糟糕 几乎让我辞职了 两次 因为我没有那么多时间 这个任务给了我两周时间 所以我无法重写整个内容 我按照要求进行了修改 目前正在进行测试 问题是 代码应该改变它在其他年份的行为 这个问题的问题
  • typescript 扩展数组原型

    我只想使用一种方法来扩展 Array 原型 将字符串数组的每个项目转换为大写 这是我的第一种方法 Array prototype toUppercase gt map String toUppercase 为什么不工作 多谢 需要先声明该成
  • 无法为 Eclipse 安装 Maven 插件 [重复]

    这个问题在这里已经有答案了 我正在 Ubuntu 12 04 LTS 上开发 Eclipse 3 7 indigo 并且我正在尝试安装 Maven 插件 下列的this http eclipse org m2e download 页面 我添
  • 在“adb反向”上出现两次“错误:关闭”

    我正在尝试通过 ADB 反向转发端口 但它只返回以下神秘错误error closed 正常转发工作 会话片段 adb forward tcp 59778 tcp 59778 adb forward list 015d2109ce0c1a0f
  • bash trap 不会忽略信号

    请考虑这个 bash 脚本 bin bash trap INT echo sleep sleep 5 echo rsync rsync a usr lib var tmp 正如预期的那样 尝试使用 ctrl c 中断睡眠失败 但是rsync
  • 为什么“transform(s.begin(),s.end(),s.begin(),tolower)”不能编译成功?

    给出代码 include
  • 如何防止在代码更改时必须重建映像

    我开始在个人项目中使用 Docker 并意识到这将我的开发时间增加到了无法接受的程度 如果我必须为每次代码更改重建映像 我宁愿启动 LXC 实例 我听说有一种方法可以安装它 但不确定具体如何进行 我还有一个 docker compose y
  • 删除[]对象数组

    我已经分配了对象数组 Objects array new Objects N 我应该如何删除这个数组 只是 delete array 或者迭代数组的元素 for int i 0 i
  • Jinja2 中的稳定排序

    可以应用排序过滤器 http jinja pocoo org docs templates sort在 Jinja2 中 首先按一个属性对列表进行排序 然后再按另一个属性排序 这似乎是很自然的事情 但在我的测试中 前面的排序完全不稳定 所有
  • 如何检测正在使用哪个 .NET 运行时(MS 与 Mono)?

    我想知道程序执行期间是使用 Mono 运行时还是 Microsoft 运行时执行 我当前正在使用以下代码来确定我是否在 MS CLR 上 static bool IsMicrosoftCLR return RuntimeEnvironmen
  • 如何确定分离的 pthread 是否还活着?

    如何确定分离的 pthread 是否仍然存在alive 我有一个与线程的通信通道 一个从线程向外指向的单向队列 但是如果线程dies没有喘息 我应该放弃使用流程吗signals或者我可以probe以某种方式提高线程活力 对于可连接 即不分离
  • 将 for wait...of 与同步迭代一起使用

    MDN says https developer mozilla org en US docs Web JavaScript Reference Statements for await of for await of有两个用例 The f