异步承诺返回函数的同步与异步执行

2023-12-03

当制作返回承诺的异步函数时,在每个实现中我都看到了这种做法:

function asyncFunction() {
 return new Promise((resolve,reject) => {
  // the function code
  if (condition) resolve()
  else reject()
 })
}

换句话说,执行器函数中的函数代码是同步运行的,只有 Promise 结算和回调调用是异步完成的。这对我来说是违反直觉的,因为当我想到异步函数时,我想到的是一个函数,当它执行时,立即返回,并将其操作推迟到以后。这是一个例子:

function asyncFunction() {
 return new Promise((resolve,reject) => {
  setTimeout(() => {
   // the function code
   if (condition) resolve()
   else reject()
  }, 0)
  
 })
}

这意味着函数的代码将在任务中执行,并且在返回的 Promise 上注册的所有回调将作为微任务运行。该函数立即返回,并且不会使线程挨饿。

我现在有几个问题。

  1. 我的推理正确/有意义还是我没有看到一些边缘情况?
  2. 异步函数有什么特点?我看到两个表征异步函数特征的候选参数:1. 立即返回并稍后运行其计算;2. 回调稍后/异步运行。对我来说,这种函数的唯一特征是第一点,但正如我在我能找到的所有代码中看到的那样,唯一重要的是回调是异步运行的。
  3. 使用我的代码版本而不是第一个版本有什么优点/缺点吗?

承诺是工具manage异步代码,而不是使代码异步。

您的第一个示例根本不应该使用承诺。该函数所做的一切都是阻塞的。使用承诺只会增加复杂性。 (例外情况是,如果您正在编写代码来匹配有时用于异步操作的接口)。

你的第二个例子也是毫无意义的(至少几乎总是如此)。正在添加超时just让事件循环继续处理函数之外的内容,然后再重新拾取它。这can很有用(例如,允许浏览器在执行耗时的操作之前重新绘制窗口),但方法应该是:

  1. 我需要在下一个操作运行之前重新绘制窗口
  2. 我将在该操作之前运行超时
  3. 我将使用 Promise 来管理该代码

…而你的代码seems扭转这一局面,从承诺开始,并试图证明其使用的合理性。

如果您有一些耗时的代码要运行并且您不希望它阻止主事件循环,那么您可能应该使用worker所以它在不同的线程上运行。您可能会使用 Promise 来处理该代码,并将其结果发送回主事件循环。

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

异步承诺返回函数的同步与异步执行 的相关文章

随机推荐

  • 如何使div的百分比宽度相对于父div而不是视口

    这是我正在使用的 HTML div style min width 100 min height 1000px background 3e3e3e div style width 50 height 1 div style backgrou
  • 初始化未知大小的二维数组

    我有一个二维字符数组 例如char aList numStrings maxLength 理想情况下 在程序执行期间 我希望能够修改 aList 的内容 即添加 修改或删除条目 由于 aList 可能会发生更改 因此我不想在每次更改后都必须
  • Android Smack 消息事件监听器

    我正在尝试使用 XMPP 的消息事件接口 据我了解 您可以在发送的消息上标记 请求送达通知 标志 然后收件人负责向您发送此通知 有人成功实施过这个吗 有人可以给我发送一些示例代码吗 我的代码不起作用 我的侦听器 MessageEventNo
  • Android 应用程序,文档中根元素后面的标记必须格式正确

    我已经开始从下面的链接模块 6 1 项目开始处理一些 Android 教程演示http www vogella de articles Android article html 对于下面的 menu xml 中的菜单标签 我在 Eclips
  • NSLinguisticTagger enumerateTagsInRange 不适用于具有 NSLinguisticTagSchemeNameTypeOrLexicalClass 的设备

    这是我正在使用的代码 无论我在设备上使用什么句子 它都不会打印任何内容 在模拟器上运行得很好 NSMutableArray getTagEntries NSString sentence NSArray
  • C# 字符串到浮点转换无效?

    var x dr NationalTotal ToString 给我 333333333 var xxx Convert ToSingle dr NationalTotal ToString 给我 333333344 有什么想法吗 发生这种
  • Firefox 插件忽略 iframe

    我正在尝试为 LinkedIn 构建一个插件 但内容脚本会在每一帧中输出 我的 main js exports main function var pageMod require page mod pageMod PageMod inclu
  • 使用 afterFeature 钩子调用时动态场景冻结

    当我使用 afterFeature 挂钩调用功能文件进行测试清理时 出现奇怪的行为 清理功能文件被正确调用 因为我可以看到文件背景部分的打印 但由于某种原因 场景大纲的执行挂起 我尝试使用 Junit5 运行程序运行功能 并在 Intell
  • TOMCAT - HTTP 状态 404 [重复]

    这个问题在这里已经有答案了 我在 eclipse 中设置了我的服务器 当我运行它时 控制台打印 mai 02 2013 4 05 13 PM org apache catalina core AprLifecycleListener ini
  • 无法使用角度材料显示角度 2 中垫表中的选定行

    我使用带选择框的角度材料在角度 2 中实现了一个简单的表格 当我选择所需的行并单击 传输所选行 时 这些行将被拼接 并且拼接的行将显示在我的控制台中 但我无法在输出窗口中显示它们 请通过链接访问样本示例 我想在我的输出屏幕上显示控制台输出
  • 如何设置 try-catch 以确保用户输入枚举列表中包含的值?

    我有一个星期几的枚举列表 以及一个要求用户输入当前日期的程序 可以是列表中的任何一天 我需要实现一个 try catch 以确保用户输入有效的日期 但我遇到了一些困惑 当我搜索如何使用枚举执行异常时 大多数网站建议使用 TryParse 而
  • 如何验证 Codeigniter 中组合的多个字段?

    有没有一种创造性且简单的方法可以同时检查多个表单字段 我有一个带有动态生成字段的表单 每个字段都有一个唯一的 ID 问题是提交时不需要填写所有字段 但在提交之前至少必须填写一个字段 有没有办法在 Codeigniter 中做到这一点 或者我
  • 不存在 ID 为 *id* 的消息

    我正在尝试列出通过 mandrill API 发送的电子邮件 我可以通过打电话列出它们https mandrillapp com api 1 0 messages search json 这给了我一个列表 其中包含一堆已发送的消息以及一个
  • 保留通用变量之间的类型限制

    假设我们有一些类有一个重要的泛型变量T另一个类有两个字段 一个包含 一个不包含 class Wrapper
  • C++ 调用非默认构造函数作为成员[重复]

    这个问题在这里已经有答案了 假设我有一个类 A 和一个类 B B 用作 A 中的成员 B 没有默认构造函数 但需要参数 class B B int i class A B m B A m B 17 this gives an error 我
  • 当应该使用 String 时,groupingBy 将键的对象返回为 Map

    假设我有一个品牌对象列表 POJO 包含返回字符串的 getName 我想建立一个Map
  • R 记录脚本的显示名称

    这是我当前问题的一个原子示例 目前我有一个包含多个 R 脚本的项目 全部位于名为 DIR 的同一目录中 我在 DIR 中有一个主脚本 它获取所有 R 文件 并包含一个基本配置 basicConfig 我在 DIR 中使用了两个脚本 dog
  • C++:重复执行 do while 循环

    我对这个超级新手问题感到非常抱歉 但我一生都无法理解如何重复 do while 循环 我将 while 循环更改为 do while 循环 现在我不知道如何让它询问 您想重复 Y 还是 N 有什么解释吗 我读过各种完成 do while 循
  • 如何使用 jQuery 访问多维 JSON 数组中的值

    因此 我使用 getJSON 获取多维 JSON 数组 并且想要访问数组中的值 但无法访问比数组中第一个元素更长的值 producers producer id 1 name Em u00e5mejeriet address Grenv u
  • 异步承诺返回函数的同步与异步执行

    当制作返回承诺的异步函数时 在每个实现中我都看到了这种做法 function asyncFunction return new Promise resolve reject gt the function code if condition