使用 async/await 与 Promise 的区别?

2024-04-13

我正在寻找有关在我的 NodeJS 应用程序中使用什么的答案。

我有处理对 mssql 的通用 dB 访问的代码。这段代码是使用async函数,然后我使用承诺来调用该函数,一切正常。

随着我的应用程序变得越来越大,代码也越来越大,我计划将一些逻辑转移到函数中,然后调用它们。

所以我的问题是:混合使用 async/await 和 Promise 是否有缺点,或者真的不重要吗?

异步/等待使编写更具可读性的代码变得更容易,因为在返回某些内容之前我必须读取和写入多个数据库,并且我需要其中一些结果。

那么问题是更好的方法是什么? dB 层上的异步/等待已设置且无法更改 逻辑层 async/await 允许我在函数调用上使用 async/await ,或者如果我使用 Promise 进行逻辑,那么我就会在函数调用上使用 Promise。

因此,我希望除了能够编写更简洁的代码之外,如果一个人比另一个人有更多的优势,那么有人可以给我更多的见解。


async/await和承诺密切相关。async函数返回 Promise,await 是等待 Promise 得到解决的语法糖。

混合承诺和承诺的唯一缺点async函数可能会影响代码的可读性和可维护性,但是您当然可以使用异步函数的返回值作为 Promise 以及await对于返回承诺的常规函数​​。

您是否选择其中之一主要取决于可用性(您的node.js/浏览器是否支持async?)以及您的审美偏好,但一个好的经验法则(基于我在撰写本文时自己的偏好)可能是:

如果您需要串行运行异步代码:请考虑使用async/await:

return asyncFunction()
.then(result => f1(result))
.then(result2 => f2(result2));

vs

const result = await asyncFunction();
const result2 = await f1(result);
return await f2(result2);

如果您需要嵌套承诺:使用async/await:

return asyncFunction()
.then(result => {
  return f1(result)
  .then(result2 => f2(result, result2);
})

vs

const result = await asyncFunction();
const result2 = await f1(result);
return await f2(result, result2);

如果您需要并行运行它:使用 Promise。

return Promise.all(arrayOfIDs.map(id => asyncFn(id)))

建议您可以使用await在表达式中等待多个任务,如下所示:
*注意,这仍然按从左到右的顺序等待,如果您不希望出现错误,那么这是可以的。否则,行为会有所不同,因为快速失败行为 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all#Promise.all_fail-fast_behaviour of Promise.all()

const [r1, r2, r3] = [await task1, await task2, await task3];
(async function() {
  function t1(t) {
    console.time(`task ${t}`);
    console.log(`start task ${t}`);
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.timeEnd(`task ${t}`);
        resolve();
      }, t);
    })
  }

  console.log('Create Promises');
  const task1 = t1(100);
  const task2 = t1(200);
  const task3 = t1(10);

  console.log('Await for each task');
  const [r1, r2, r3] = [await task1, await task2, await task3];

  console.log('Done');
}())

但正如Promise.all,如果出现错误,并行 Promise 需要得到正确处理。您可以阅读更多相关内容here https://stackoverflow.com/a/53345172/985454.

请注意不要将前面的代码与以下代码混淆:

let [r1, r2] = [await t1(100), await t2(200)];
function t1(t) {
  console.time(`task ${t}`);
  console.log(`start task ${t}`);
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.timeEnd(`task ${t}`);
      resolve();
    }, t);
  })
}
console.log('Promise');
Promise.all([t1(100), t1(200), t1(10)]).then(async() => {

  console.log('Await');
  let [r1, r2, r3] = [await t1(100), await t1(200), await t1(10)]
});

使用这两种方法并不等效。了解更多关于差异的信息 https://stackoverflow.com/a/54291660/428486.

到底,Promise.all是一种更简洁的方法,可以更好地扩展到任意数量的任务。

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

使用 async/await 与 Promise 的区别? 的相关文章

  • 从字符串中删除货币符号并使用 Javascript 中的单行转换为数字

    我下面有一个字符串 它是以英镑为单位的价格 我想删除货币符号 然后将其转换为我可以用来与另一个值进行比较的数字 价格 例如 X gt Y 14 50 我之前已将字符串转换为用于货币的数字 var priceNum parseFloat pr
  • 对 JavaScript 中的 while 循环感到困惑

    我可能在这里有点厚重 但请回答我这个问题 考虑以下代码 a 1 while a lt 6 console log a a 如果我运行这个 我会在控制台中得到从 1 到 6 的值 然后是另一个 6 现在看看这个 a 1 while a lt
  • Atom“自动完成”不起作用

    因此 当您安装 Atom 时 autocomplete 会随其一起提供 并且默认情况下处于启用状态 当我编写代码时 什么也没有显示 为什么 是否需要配置任何文件才能正常工作 In autocomplete plus settings pag
  • npm install -D sass-loader node-sass Vue.js 2021

    您好 问题是为 Vue js 设置 SASS 我跑 Node js 15 7 0 Vue js vue cli 4 5 11 这是我在运行此命令时在控制台中遇到的错误 npm install D sass loader 节点 sass np
  • JavaScript 中的 Promise.all:如何获取所有 Promise 的解析值?

    我编写了以下node js文件 var csv require csv parser var fs require fs var Promise require bluebird var filename devices csv var d
  • 是否可以用 json 进行表达式/计算?

    我使用出色的 json server 作为应用程序的后端 它对于访问自定义端点以检索一些数据非常有用 但是如果它允许我进行计算 表达式以便我也可以模仿后端行为 那将会非常有用 以这个数据结构为例 products name football
  • 嵌套对象的 AJV 模式验证

    函数返回的对象看起来像这样 answer vehicle type 1 message Car model VW color red 答案 对象始终存在 其他字段基于 vehicle type E g 如果vehicle type 1 则有
  • 按自定义字母顺序对数组进行排序

    如何对这样的数组进行排序 apple very auto tom tim violet 要按 v a t x b 等排序 不按字母顺序 violet very auto tom tim 在脚本中 我会做这样的事情 myArray sort
  • 如何获取调用函数的“this”值?

    如果我有一个这样的函数 function foo this console log this function bar bar prototype func function foo this var test new bar test f
  • 使用JS将图像的特定背景颜色设置为透明

    我正在使用以下代码来修改图像的透明度 然而 我想做的只是修改图像的背景颜色并将其 alpha 通道设置为 0 而不是整个图像 以下代码将整个图像的 Alpha 透明度设置为 0 var ctx this data getContext 2d
  • 避免 AngularJS 部分视图在 IE 中缓存

    我正在开发一个 ASP NET MVC 应用程序 它也有一些 angularJS 我有一个主页 其中有不同的选项卡 当您单击它们时 它们会加载角度部分视图 主页是这样的 div class widget div div class widg
  • 获取键盘事件中的鼠标位置

    我试图在用户按住 Shift 键时出现选择轮 滚轮应以鼠标位置为中心 然而当我测试这个时 pageX and clientX两者在事件对象上都未定义 是否可以通过键盘事件获取鼠标坐标 不 只需跟踪mousemove事件并持续保存当前位置 以
  • Typeahead.js 干扰 Bootstrap 输入组

    如何防止 Typeahead js 拆分我的 Twitter Bootstrap 3 输入组 每当我将 Typeahead javascript 指向属于输入组一部分的文本区域时 连接的文本区域和提交按钮就会停止连接 这只是 Typeahe
  • HTML if 语句在 CDN 失败时加载本地 JS/CSS

    当从 CDN 或任何外部服务器加载 CSS JS 文件时 有可能 即使概率很低 由于外部故障而丢失该文件 在这种情况下 html 页面将因缺乏适当的 CSS 和 JS 而被损坏 有没有一种实用的方法可以在 CDN 故障时加载本地版本 IF
  • JavaScript - 这个这个

    String prototype foo String prototype foo bar function How can you reference the grandparent string console log this par
  • CKEditor TypeError:c[a] 在 CodeIgniter 中未定义

    我正在尝试在基于 codeigniter 的网站中安装 CKEditor 并且我已按照本教程进行操作 Codeigniter 教程中的 CKEditor http nukium com developpement php framework
  • 如何在变量名中使用变量

    所以我正在使用这样的 json 变量 opponentInvData item1 它包含项目 1 到 6 我需要动态访问不同的项目并将它们设置为空 itemNum 是我需要访问的特定项目 我正在尝试使用 eval 函数 var itemNu
  • 如何在 Javascript 中将字符串数组转换为特定的树结构

    我从后端获取文件路径列表 它代表文件夹结构 如下所示 paths path to file1 doc path to file2 doc foo bar doc 路径的长度是任意的 为了使用文件树组件 角度2树组件 https github
  • 条件顺序仅在 init AngularJS 上执行

    如何在视图初始化时仅运行 orderBy 过滤器一次 我不希望我的列表在运行时被重新排序 li li 使用 orderBy 作为控制器中的过滤器 app controller DemoCtrl scope filter function s
  • JS中如何过滤多个字符串? [复制]

    这个问题在这里已经有答案了 我希望能够过滤数组中的多个字符串 类型 例如我想过滤类型meat并输入fruit在下面的数据结构中 我想要实现的是过滤数据对象 const data type meat food hamburger type f

随机推荐

  • PivotTable.js 有条件地更改文本颜色

    所以我正在使用 PivotTable js 它对工作有很大帮助 但现在 我正在尝试获取一个过滤器来根据值更改单元格的颜色或单元格内的字体 例如 如果我的数据集中有一个日期数组 dates N A 4 12 2016 7 9 2024 7 9
  • Python 类输入参数

    我是面向对象编程的新手 我的想法是实现以下课程 class name object name def init self name print name 然后的想法是创建该类的两个实例 person1 name jean person2 n
  • JSF 国际化 f:loadbundle 或通过 faces-config:性能点

    有两种方法可以将属性文件加载到 JSF 2 0 中 全球资源包 全局加载属性文件 以便所有jsf页面都可以访问消息 您可以创建一个 faces config xml 文件并显式声明属性文件 面孔配置 xml
  • 使用java进行HTML解析[重复]

    这个问题在这里已经有答案了 可能的重复 可以解析 HTML 文档并构建 DOM 树 java https stackoverflow com questions 1433250 possible to parse a html docume
  • BufferedImage.getGraphics().drawImage() 改变像素值

    这是一个后续previous https stackoverflow com questions 23707736 strange bufferedimage behaviour with 4bits palette问题 标准推荐的改造方式
  • 基本 Flask:添加有用的功能

    我编写了一个在终端中运行的 python 脚本 并使用 Flask 将其移植到网络上 我已经完成了教程的部分内容 具体来说 http blog miguelgrinberg com post the flask mega tutorial
  • 更改 C# 中多行文本框的特定行

    我无法更改多行文本框的特定字符串 假设多行文本框的第一行是 Hello 第二行是 Bye 但是当我尝试更改第二行的值时 如下所示 textBox1 Lines 1 Good bye 当我使用调试模式看到结果时 它不是 再见 我也读过这个MS
  • 使用 React hooks 对数组进行排序

    我正在使用反应钩子对数组进行简单排序 但它不更新状态 谁能指出我要去这里做什么 import React useState from react import ReactDOM from react dom import styles cs
  • 如何在 Java 中使用 Jython Standalone 安装 Python 库?

    我正在尝试使用 Java 中的 Jython Standalone jar 安装 Python 库 我的代码似乎将 PIP 7 1 2 安装在独立 jar 旁边的文件夹中 但是一旦我尝试使用 PIP 进行自身升级 它就会失败并出现 ZipI
  • 本地放置文件的 jQuery .load() 的跨源问题

    我面临着一个非常基本的 jQuery 编码的恼人的跨源问题 我正在尝试调用 加载本地放置的test 1 html我的主 javascript 文件中的文件 load container load test 1 html function d
  • git add 错误:“致命:malloc,内存不足”

    当我尝试执行 git add 时 出现错误 致命 malloc 内存不足 我想系统显然已经耗尽了内存 但是有没有办法解决这个问题 我还运行 Windows Server 2003 并使用 msysGit 编辑 经过更多搜索后 我认为这是 g
  • 使用相同异常类作为参数的“ except”语句两次

    在Python中 我该如何使用except具有相同异常名称的块两次try except语句 无需将代码包装到另一个语句中try except block 简单的例子 这里each呼叫pages get可能会引发异常 try page pag
  • 是否有 Swift 代码的 Github markdown 语言标识符?

    我在用着https jbt github io markdown editor https jbt github io markdown editor在线文档工具 我想知道是否有一个标识符可以识别 swift 语法元素 谢谢 swift s
  • Map 和 ImmutableMap 的区别

    我在支付网关公司工作 在分析我遇到的代码时 ImmutableMap 对象 我想知道有关的所有细节 它是什么 与地图相比有什么优势 core java 支持 ImmuatbleMap 吗 ImmutableMaps是在Guava中引入的 它
  • php_ini 未设置为 php.ini 位置

    我正在尝试在 OSX 上安装适用于 XAMPP 的 MongoDB PHP 驱动程序 我的终端显示以下内容 configuration option php ini is not set to php ini location 这是什么意思
  • AssertionError:Egg-link ..与ReviewBoard的安装位置不匹配(位于/...)

    AssertionError Egg link home daniel other rb reviewboard does not match installed location of ReviewBoard at home daniel
  • 使用 cout << 运算符时,如何用前导零填充 int? [复制]

    这个问题在这里已经有答案了 I want cout输出一个带有前导零的 int 所以该值1将被打印为001和价值25打印为025 我怎样才能做到这一点 通过以下内容 include
  • 是否可以反映 Javascript 函数的参数?

    是否有可能获取 Javascript 函数的所有参数被写入接受 我知道所有 Javascript 函数参数都是 可选的 如果没有 是否可以获得参数的数量 例如 在 PHP 中 可以使用 class new ReflectionClass c
  • R Shinydashboard 动态菜单项

    我正在尝试生成多个menuItem动态地 可能很简单 但我没有得到正确的想法 library shiny library shinydashboard port tables lt c tab1 tab2 tab3 tab4 These a
  • 使用 async/await 与 Promise 的区别?

    我正在寻找有关在我的 NodeJS 应用程序中使用什么的答案 我有处理对 mssql 的通用 dB 访问的代码 这段代码是使用async函数 然后我使用承诺来调用该函数 一切正常 随着我的应用程序变得越来越大 代码也越来越大 我计划将一些逻