Node.js 承诺、异步或只是回调

2024-04-23

你能向初学者解释一下“承诺”、“异步”和“回调”之间的区别吗?这些术语如何相互关联?这些是同一件事吗?不同的东西?我什么时候使用哪个?


异步是启动计算并提供函数或注册处理程序的一般设计模式,该处理程序最终将在计算完成时使用计算结果进行调用(而不是在开始其他工作之前阻塞并等待计算完成) 。如果没有异步,同时启动多个计算需要使用线程。

“回调”是指您提供给异步计算的函数,该函数将在计算完成时被调用。它被称为“回调”,因为它由异步函数调用,并且在被调用时,它将控制流返回到您可以控制的代码中。

“Promise”是一种特定的 JavaScript 原型和相关框架,可为异步风格编写的代码带来一致性。 Promise 表示可能已完成或未完成(成功或不成功)的异步计算,并提供一种对结果进行操作或处理错误的方法,无论异步计算的完成状态如何。 Promise API 还提供了用于组合多个异步计算的输出的实用程序(例如,在下一次计算之前等待一组异步计算中的一个或全部完成)。

举一个没有 Promise 的简单例子:

var addThen = function(a, b, handler) {
  var result = a + b;
  handler(result);
};

// ...
addThen(2, 3, console.log);  // prints 5
// ...

以及 Promise 的等价物:

var add = function(a, b) {
  return Promise.resolve(a + b);
};

// ...
add(2, 3).then(console.log); // prints 5
// ...

异步代码可以使用 Promise 编写,也可以不使用 Promise 编写,但使用 Promise 的主要优点是一致性(例如,成功回调和失败回调在参数列表中的位置、是否支持失败回调等)和支持库可以将它们结合在一起。

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

Node.js 承诺、异步或只是回调 的相关文章

随机推荐

  • 无法安装 matplotlib

    当我在 64 位 Windows 中安装 matplotlib 时 它需要 numpy 然后我安装了 numpy 并再次安装了 matplotlib 然后它说 numpy 1 7 1 freetype2 found but unknown
  • Perforce:如何删除 p4v 拒绝删除的变更列表?

    使用 perforce 一段时间后 我留下了许多尚未完成的变更列表 为了清理 我想摆脱其中的一部分 所以这就是让事情变得复杂的原因 对于更改的子集 客户端的主机已更改 某些更改包含搁置的文件 更改列表中的文件可能会被删除或移动 当更改列表满
  • iOS——codeSense 中自动合成属性的“添加”方法

    我刚刚创建了一个具有以下属性的 iOS 类 property nonatomic strong NSString foo property nonatomic strong NSObject bar property nonatomic C
  • 如何忽略多容器 Pod 中容器的故障?

    我有一个多容器应用程序 app sidecar 两个容器都应该一直处于活动状态 但 sidecar 并不是那么重要 Sidecar 依赖于外部资源 如果该资源不可用 Sidecar 就会崩溃 它会导致整个吊舱瘫痪 Kubernetes 尝试
  • VirtualBox 是否可以使用 python3 绑定?

    我正在尝试使用 VirtualBox 的 python 3 绑定 但似乎存在损坏的依赖关系 我觉得很奇怪的是 在人们遇到这个问题的四年里 这个问题还没有得到解决 也许我错过了一些明显的东西 众所周知它会发生 我已经通过操作系统包管理器安装了
  • javax.mail.MessagingException:无法连接到 SMTP 主机:<主机名> 端口:25 响应:554

    我正在尝试使用 java mail api 发送邮件 我的 smtp 服务器是 ibm 服务器 我面临这个异常 javax mail MessagingException Could not connect to SMTP host
  • 如何让 Cargo 显示哪些文件导致重建?

    我在用cargo maturin and pytest构建混合 Python Rust 项目 在开发过程中 我经常循环使用命令 cargo test p mypkg release maturin develop release pytho
  • 如何从 fresco(facebook 的 android lib)中排除 arm64-v8a 目录

    正如你所看到的 Fresco有arm64 v8a目录 但我不想要它 我应该在build gradle中写什么 compile com facebook fresco fresco 0 5 3 exclude group com androi
  • Android 开源人脸识别 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 使用Android 人脸识别有哪些开源选项 以下是我在人脸识别库上找到的一些链接 Android s F
  • 我可以通过委托给 EF 中的存储过程来延迟加载导航属性吗?

    我有以下客户类别 public class Customer public long Id get set public virtual ICollection
  • Nginx 对 cms 后端的重写规则

    我需要在 nginx 服务器中制定 url 重写规则 服务器块 就像我之前的 apache 服务器一样 这是 htaccess 中的代码 我需要将其实现 转换 到我现有的代码中 RewriteRule A Za z0 9 A Za z0 9
  • 如何通过 sql plus 从命令行发出单个命令?

    使用 SQL Plus 您可以运行script从命令行使用 运算符 如下所示 c gt sqlplus username password databasename c my script sql 但是是否可以只运行一个单一命令使用类似的语
  • 从色调 0 到 360 的 SVG 线性渐变

    source elv1s ru http elv1s ru files svg gradient hue png 做这样的渐变的正确方法是什么 我试过this SVG http elv1s ru files svg gradient hue
  • 如何使用表达式树安全访问可为空对象的路径?

    当我将反序列化的 XML 结果放入 xsd 生成的对象树中 并希望使用该树 a b c d e f 内的某些深层对象时 如果该查询路径上的任何节点丢失 它将给出异常 if a b c d e f null Console Write ok
  • 使用 inno setup 安装时检查可用端口

    我正在尝试在 inno setup 中创建以下功能 用户被要求输入他们希望我的应用程序进行通信的端口 一旦他们进入端口 他们就可以点击检查按钮 此检查按钮将运行一些代码来查看安装计算机上的端口是否可用 到目前为止 我可以为用户创建输入框来输
  • VectorDrawable 导致 NumberFormatException

    我正在使用 Android Lollipop 的全新且炫酷的矢量绘图 但对于某些 SVG 文件 当使用该可绘制对象时 我总是在运行时遇到 NumberFormatException 这是我的堆栈跟踪 android view Inflate
  • 无法从干预/图像中的给定 url 进行初始化": "^2.3

    我想保存来自 google plus 的图像 如下网址所示 它在本地计算机上也能正常工作 但上传到 ubuntu14 时出现以下错误 image Image make https lh6 googleusercontent com Gcp
  • 如何禁用鼻子测试的覆盖率报告

    希望有一个简单的 python djangonose测试问题 虽然我找不到答案nose的文档 运行测试后如何停止显示覆盖率报告 manage py test 我的覆盖率报告有一个巨大的问题 迫使我向后滚动几十行以获取失败测试的回溯 这确实中
  • python中无替换的加权随机样本

    我需要获得一个k sized从总体中进行无替换的样本 其中总体中的每个成员都有相关的权重 W Numpy s 随机选择如果没有更换 则不会执行此任务 并且随机抽样不会采用加权输入 目前 这就是我正在使用的 P np zeros 1 Pare
  • Node.js 承诺、异步或只是回调

    你能向初学者解释一下 承诺 异步 和 回调 之间的区别吗 这些术语如何相互关联 这些是同一件事吗 不同的东西 我什么时候使用哪个 异步是启动计算并提供函数或注册处理程序的一般设计模式 该处理程序最终将在计算完成时使用计算结果进行调用 而不是