异步函数何时实际返回待处理的承诺?

2023-12-28

我用谷歌搜索了这个问题很多次,但我看到这个问题的唯一答案是:

异步函数总是返回一个承诺

但我没有找到任何可以回答这种情况何时真正发生的问题。

是一进入异步函数还是一遇到第一个await关键词?

我刚刚写了这段代码:

async function main() {
  console.log(true);
  let p = await new Promise(r => setTimeout(r, 2000, 100));
  return p;
}
async function f() {
  inner(await main())

  function inner(d) {
    console.log(d + 10)
  }

  console.log('done')
}

f();

最重要的一行是:

inner(await main())

main()将首先执行,因为函数调用在优先级表中具有更高的优先级,并且当异步函数返回一个承诺时,它返回一个待处理的承诺!

但要返回它,我们必须首先执行 main(),因此它会进入主执行上下文并看到console.log(true);

现在是待处理的承诺由main()?

或者它会记录下来然后到达await关键字,然后它会返回一个待处理的承诺?

如果这是我们的代码怎么办:

async function main() {
  (function thatTakes30SecondsToFinish() {
    // some time consuming task
  }())
  let p = await new Promise(r => setTimeout(r, 2000, 100));

  return p;
}

现在在这种情况下,这会main()在这一行inner(await main())立即返回待处理的承诺还是需要 30 秒才能返回待处理的承诺?

现在我的猜测是:

这条线inner(await main())将立即返回一个待处理的承诺,但 main() 内的代码将继续执行,直到到达第一个等待关键字,这是正确的吗?


异步函数同步运行,直到到达第一个await(或函数的结尾)。然后它返回一个新的未解决的 Promise,该 Promise 将在稍后函数完成执行时解决。然后,异步函数的执行将停止,而调用异步函数的代码的同步执行将继续。

这行inner(await main())将立即返回一个待处理的承诺,但main()内部的代码将继续执行,直到到达第一个await关键字,这是正确的吗?

没有。第一main()将同步执行,直到异步主函数内的代码到达await,那么它将返回一个承诺并执行f继续。正如当时的await达到f它本身也返回一个新的 Promise 并停止执行。

语义细节可以在规格 https://262.ecma-international.org/11.0/#await.

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

异步函数何时实际返回待处理的承诺? 的相关文章

随机推荐

  • Android 扩展文件 - 测试时未找到资源

    这是我的包名称 com abc ss 现在我已经在 mnt sdcard Android obb com abc ss main 2 com abc ss obb 中手动创建了一个包名为 com abc s 的文件夹 但是当我运行示例应用程
  • 从 gmail-api 获取发件人电子邮件

    我正在使用 gmail api 但无法获取发件人的电子邮件 我说的是电子邮件的 完整 格式 我认为发件人的电子邮件实际上是使用 gmail 的网络界面写在 发件人 字段中的电子邮件 这种完整格式的标头通常包括 X Original Auth
  • 我应该在清单中声明 MainFragmentDemoActivity 吗?

    我正在尝试学习片段 我正在单击片段类 我的应用程序崩溃了 我已在清单中声明了它 但是为什么会发生这种情况 我的菜单类 public class Menu extends ListActivity String classes Spinner
  • 网页上某些缩放级别的边框

    我们的公司网站正在经历一些奇怪的恶作剧 当您在台式电脑或笔记本电脑上查看它时 它在任何浏览器上看起来都很好 然而 当您在移动设备上浏览网站时 您会在 iOS 上的 Safari 和 Android 上的 Chrome 和 Android 2
  • libGDX:如何检查演员是否存在于舞台上

    如何检查演员是否已被移除并不在舞台上 像这样 if actor isRemoved enter code here 来自文档 https libgdx badlogicgames com nightlies docs api com bad
  • 在 EC2 主节点上初始化 Ray 时出错

    我正在使用 Ray 在 AWS EC2 上的 Ubuntu 14 04 集群上运行并行循环 以下 Python 3 脚本在我的本地计算机上运行良好 只有 4 个工作线程 省略了导入和本地初始化 ray init initialize Ray
  • 如何从 XAML 内部访问嵌套命名空间?

    我有一个包含 2 个项目的 WPF 应用程序 一个用于 ViewModels MyApp Core 另一个用于 Views MyApp 在 Views 和 ViewModels 内部 我有不同的嵌套命名空间 例如 MyApp Core Vi
  • shared_from_this 导致 bad_weak_ptr

    我正在尝试在 asio 中保留已连接客户端的列表 我已经改编了文档中的聊天服务器示例 http www boost org doc libs 1 57 0 doc html boost asio example cpp03 chat cha
  • 如何在我自己的android库模块中添加crosswalk webview?

    我正在开发一个 Android 库模块 其中必须包含 Crosswalk Webview 我使用 Github Sonatype 创建库 https github com sonatype https github com sonatype
  • 处理多个文件(图像)上传到 AWS S3 Swift

    我一直在尝试研究从 iOS 应用程序上传多个图像到 AWS S3 的最佳方法 我在 StackOverflow 上看到过一些类似的问题 其中最接近 答案 的问题就在这里 link https stackoverflow com questi
  • 如何将“camelCase”转换为“Camel Case”?

    我一直在尝试获取 JavaScript 正则表达式命令来将类似的内容转换为 thisString into This String 但我得到的最接近的是替换一个字母 导致类似的结果 Thi String or This tring 有任何想
  • C++ 从文本文件读取到数组/字符串

    这是我到目前为止的代码 我需要做的是从两个不同的文本文件 Matrix A 和 Matrix B 中读取 我可以这样做 但是对于我读到的每个文本文件矩阵 它只会出现 1 0 0 所以基本上是第一行 矩阵 A 的整个文本文件实际上是 1 0
  • Typescript - 错误地推断“从不”

    这是一个基本用例 用 null 初始化变量 然后更改某些嵌套循环 函数中的值 let a number null null 1 forEach gt a 1 if a null a toFixed Error Property toFixe
  • RStudio:我可以弹出源窗格吗?

    我有一个双显示器 我希望可以弹出 源窗格 我在其中编辑代码 以便我可以在一个显示器中编辑代码并跟踪另一个显示器中的其他所有内容 有谁知道这是否可能 非常感谢您的帮助 此功能本周刚刚添加到 RStudio 您可以在我们的日常构建中尝试它 0
  • Java Setter 和构造函数混淆

    我对如何在Java中使用构造函数和setter有点困惑 请参阅下面的示例代码 public class Name private String name public void setName String name this name n
  • 拳击,已经成为过去式了吗?

    这样做有什么意义吗 public static void Write
  • 构建詹金斯缺失的历史

    我刚刚为我的项目设置了一个新的 Jenkins 实例 版本 2 19 4 但是 当我尝试生成多个构建进行测试时 我发现构建历史记录仅向我显示一个历史构建 升级之前 至少显示两个或更多 詹金斯中有一个地方可以设置应该显示的历史构建的数量吗 在
  • 我可以将 Google Places API 中的姓名、地址和纬度/经度存储在我自己的数据库中吗?

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 Google Places 关于存储信息的术语可能有点令人困惑 我希望有人能提供一些说明 我想构建一个数据库并收集有关企业的独特数据
  • MSBuild 是否需要安装 Visual Studio?

    我正在使用 Atlassian Bamboo 设置构建服务器 MSBuild 包含在 NET 框架中 所以我相信我至少可以在没有 VS2010 的情况下很好地构建 NET 应用程序 我们主要使用 C 进行开发 我是否需要在构建服务器上安装
  • 异步函数何时实际返回待处理的承诺?

    我用谷歌搜索了这个问题很多次 但我看到这个问题的唯一答案是 异步函数总是返回一个承诺 但我没有找到任何可以回答这种情况何时真正发生的问题 是一进入异步函数还是一遇到第一个await关键词 我刚刚写了这段代码 async function m