async/awiat和promise之间的区别

article/2025/9/18 3:42:49

今天看到了一段代码

async function async1() {console.log('async1 start');await async2();console.log('async1 end');
}
async function async2() {console.log('async2');
}
console.log('script start');
setTimeout(function() {console.log('setTimeout');
}, 0)
async1();
new Promise(function(resolve) {console.log('promise1');resolve();
}).then(function() {console.log('promise2');
})
console.log('script end');

看到输出,才发现自己对async/await了解还不够,对于其与prominodese的区别还需要进一步进行研究
node.js

script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout

chrome console
在这里插入图片描述

1. async/await的一些基本概念

  1. async函数的await命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象)
  2. async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果
  3. async 返回一个Promise对象,可以使用then方法添加回调函数,当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句
  4. async函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖
  5. async函数内部return语句返回的值,会成为then方法回调函数的参数
  6. async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到
  7. async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误,也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数
  8. 正常情况下,await命令后面是一个 Promise 对象,它的返回值,实际上就是Promise的回调函数的resolve的参数。如果不是 Promise 对象,就直接返回对应的值
  9. 若await命令后面是一个thenable对象(即定义了then方法的对象),那么await会将其等同于 Promise 对象
  10. 任何一个await语句后面的 Promise 对象变为reject状态,那么整个async函数都会中断执行。
  11. 如果await后面的异步操作出错,那么等同于async函数返回的 Promise 对象被reject
  12. 为了防止出错,最好把await命令放在try…catch代码块中

2、关于上面那段代码输出的解释

  1. 打印script start
  2. 执行async1(),打印async1 start
  3. 执行await async2(),async2()也是async定义的函数,打印async2,同时async2()返回一个promise对象
  4. 上一步async2()返回的promise对象会立即执行,遇到resolve,放入任务队列等待执行
  5. 执行new Promise,立即执行,打印promise1,其resolve()放入队列中等待执行
  6. 打印script end
  7. 执行第4步放入任务队列的resolve回调,因为async2()没有返回值,所以该resolve参数为undefined,什么也不打印
  8. 此时await等待的promise对象已经有了结果,可以继续执行async1函数后面的任务,打印async1 end
  9. 取出第5步放入任务队列的reslove回调,打印promise2
  10. 最后打印setTimeout

参考:promise、async和await之执行顺序的那点事,但是对于async1 end和promise2的顺序,作者的解释我存在一点疑惑,既然promise对象是立即执行的,那async返回的promise对象也会理解执行,直接到resolve函数,然后放入任务队列,根据我的打印结果,好像更容易让我理解,这里先留存一点疑问吧,整体的思路作者讲的很好。

2、async/awiat和promise之间的区别

  1. 它们的主要区别在于处理then链,使用Async/Await明显节约了不少代码。我们不需要写.then,不需要写匿名函数处理Promise的resolve值
  2. Async/Await可以通过try…catch来同时处理同步和异步错误,(还有点没理清楚)但在promise中,try…catch不能处理内部promise的异步错误
    参考:js异步回调Async/Await与Promise区别

http://chatgpt.dhexx.cn/article/oGCPaPrU.shtml

相关文章

什么是异步

文章目录 前言一、异步是什么?二、举个例子来理解异步 1.异步最典型的例子就是“回调函数”总结 前言 在vue的过程中,我们一定会遇到诸如: function(参数).then(res>{}) 形式的代码。到底怎么编译执行的呢 &#x…

Spring Boot 基础学习之(五)页面通过自定义LocaleResolver组件实现网页页面的的中英文转换

本次项目所有能够使用的静态资源可以免费进行下载 静态资源 在前端网页,是不是看见过这样的功能 基础网页:中文表示 点击下面的English 按钮网页显示文字开始切换 通过功能性按钮实现中英文切换,在浏览器中,都带着一个功能叫翻…

网页中文转英文(国际化)

背景: 我的项目是已经完成的项目,因为要拓展海外市场,需要支持英文。 采用的方式是添加配置文件,见下文详细步骤。 本文基本转自:http://blog.csdn.net/wuhawang/article/details/52228589 在他的基础上给大家一点提示…

英语数字转换器

英语数字转换器 STL中map,stack和string的运用 描述: 在这个问题中,将用英语给你一个或多个整数。你的任务是将这些数字转换成整型表示。数字范围从-999,999,999到999,999,999.下面是你的程序必须考虑的详尽的英语单词表: neg…

Unity 中英文转换

在Resources下创建文件夹LanguageTxt,再其创建“Chinese.txt”及“English.txt”(记得保存文本时选择UTF-8) Chinese.txt Btn:这是一个按钮 English.txt Btn:This is a button 在Scripts下创建“LanguageManager.cs”及“UIText.cs” L…

SAP中英文转换--中文转英文

中文转英文-函数:CONVERSION_EXIT_CUNIT_INPUT CALL FUNCTION ‘CONVERSION_EXIT_CUNIT_INPUT’ EXPORTING input “输入的中文单位 IMPORTING output “输出的英文单位 效果图:

SAP 中英文转换-英转中

英文转中文-函数:CONVERSION_EXIT_CUNIT_OUTPUT CALL FUNCTION ‘CONVERSION_EXIT_CUNIT_OUTPUT’ EXPORTING input “输入的英文单位 IMPORTING output “输出的中文单位

将数字转换为中文

功能需求 做公司项目遇到一个有关交易金额(合同签订书)的内容,需要将查询出来的交易金额转化为中文数字,例如:壹拾捌万伍仟元整(185000.00) 需求分析 因为合同书中的数据都是动态的&#xff0c…

Java 16进制报文转换中英文报文(通过字节转换)

最近在搞这个16进制报文,网上找了很多地方,解出来的结果不是乱码就是报错,干脆自己写了。 大概是这样的,16进制的报文大家都知道是什么样子 例如: 3C E4 BA A4 E6 98 93 E6 88 90 E5 8A 9F EF BC 81 3E 20 3C 42 61 6B 31 2F 3E 因为其中包…

通过C#进行中英文转换

通过C#进行中英文转换 编写相应语言的XML文件&#xff0c;添加xml文件 ChineseSimplified.xml文件内容 <?xml version"1.0" encoding"GB2312" ?> <Softimite Language"12"><Form><Name>LoginForm</Name><…

【Adobe After Effects中英文转换2019——2023版】

** Adobe After Effects中英文转换2019——2023版 ** 如果是默认安装的软件&#xff0c;在桌面右击AE图标&#xff0c;点击打开文件所在位置&#xff0c;来到软件安装目录 C:\Program Files\Adobe\Adobe After Effects 2023\Support Files 找到AMT文件夹 点击进入&#xf…

在线中英文符号转换工具

在线中英文符号转换工具 在线中英文符号转换工具 将中文符号转换成英文符号或将英文符号转换成中文符号&#xff0c; 将单引号‘’都转换成’&#xff0c; 将双引号“”都转换成" 将中括号【】转换成[]&#xff0c; 将大括号&#xff5b;&#xff5d;转换成{} 将逗号&…

英文表格如何快速转换为中文?

今天跟大家分享一下英文表格如何快速转换为中文&#xff1f; 1.首先打开Excel文件&#xff0c;选中要翻译的单元格&#xff0c;点击【DIY工具箱】 ​ 2.点击【翻译】 3.选择【有道翻译】 4.将翻译语言设置为中文&#xff0c;然后点击【确定】 5.鼠标点击一个合适的单元格作为翻…

英文转换-在线英文批量转换器免费

英文转换&#xff0c;怎么找到好的英文转换器&#xff1f;今天给大家分享一款免费批量的英文转换器汇集了世界最好的几个翻译平台&#xff08;百度/谷歌/有道&#xff09;&#xff0c;为什么这么多人使用它&#xff1f;首先第一点翻译质量高&#xff0c;选择性多。第二点可以批…

php 英文转中文,中文转换成英文

[php]代码库/** * 中文转换成英文 */ function pinyin($_String, $_Codegb2312){ $_DataKey "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|bo|bu|ca|cai|can|cang|cao|ce|ceng|cha". "|chai|chan|chang|chao|che|chen|cheng|c…

C#小知识之中英文转换、去空格

一、中英文转换 1、安装NPinYin 2、编写代码 string str "这里是测试的中文字符串"; string str1 Pinyin.GetChineseText(str); string str2 Pinyin.GetInitials(str); string str3 Pinyin.GetPinyin(str);Console.WriteLine("取和拼音相同的汉字列表&…

Qt 语言家实现中英文切换(解决纯代码添加部件的中英文转换问题)

Qt 语言家实现中英文切换&#xff08;解决纯代码添加部件的中英文转换问题&#xff09; 关于.ts和.qm文件的生成&#xff0c;更新翻译、发布翻译等步骤就不多说了&#xff0c;其他博主有大量的描述。 现在我要解决的是中英文未完全转换的问题如下图&#xff1a; 如上图所示&a…

系统的学习网络编程,这篇就够了!(来收藏夹里吃灰)

主机字节序和网络字节序&#xff1a; 在32位机器上&#xff0c;累加器一次能装载4个字节&#xff0c;这四个字节在内存中排列顺序将影响它被累加器装载成的整数的值 大端字节序&#xff08;网络字节序&#xff09;&#xff1a;一个整数的高位字节存储在内存的低地址处 小端字节…

玩转RT-Thread之荔枝派Nano(全志F1C100S) 新手上路

玩转RT-Thread之荔枝派Nano(全志F1C100S) 一、新手上路 --作者&#xff1a;燕十三(flyingcys) blog:http://blog.csdn.net/flyingcys --荔枝派nano/RTT非官方群&#xff1a;711174828 在此感谢 RT-Thread官方成员uestczyh222提供的荔枝派Nano内核移植、rttbootloader文件、…

技术杂谈-再谈软硬SDN(2)

以下文章来源于微信公众号&#xff1a;网络里卖艺的小青年 &#xff0c;作者我就是那个KK 不好意思&#xff0c;本文有点长&#xff0c;需要阅读10-15分钟。 上一篇文章得到了很多朋友的反馈&#xff0c;软硬SDN各自有各自的优势和特点&#xff0c;对于之前的文字&#xff0c;…