Promise 和 Async/Await 到底有啥区别?

news/2025/2/13 21:37:31/

在 JavaScript 中,promise 和 async/await 是处理异步操作的两种不同方式。但它们是密切相关的。

promise 是最终导致异步操作完成或失败的对象。承诺可以处于以下三种状态之一:挂起、已履行或拒绝。异步操作完成后,承诺要么以值实现,要么因错误而被拒绝。

// Using Promises
function promiseFunction() {return  new Promise((resolve, reject) => {setTimeout(() => {resolve("Resolved");}, 2000);
})
}
console.log("Start");
promiseFunction()
.then((result) => {console.log(result);console.log("End");
})
.catch((error)=>{
console.log(error)
});
Output:
Start
Resolved
End

Async/await 是 promise 之上的语法糖。它提供了一种更简洁的异步代码编写方法,使其更易于读取和编写。使用 Async/Await,您可以编写类似于同步代码的异步代码,并且它在后台使用承诺。

在 async/await 中, async 关键字用于声明异步函数。关键字 await 用于等待承诺解析,然后再继续执行函数。关键字 await 只能在 async 函数中使用。

// Using Async/Await
async function asyncFunction() {try {console.log("Start");const promise = new Promise((resolve, reject) => {setTimeout(() => {resolve("Resolved");}, 2000);});const result = await promise;console.log(result);console.log("End");} catch (error) {console.error(error);}
}
asyncFunction()
output:
Start
Resolved
End

唯一的区别是 promise 和 async/await 之间的执行上下文。

创建承诺并启动异步操作时,创建承诺后的代码将继续同步执行。当 Promise 被解析或拒绝时,附加的回调函数将添加到微任务队列中。微任务队列在当前任务完成后但在从任务队列处理下一个任务之前进行处理。这意味着创建 Promise 之后的任何代码都将在执行附加到 Promise 的回调函数之前执行。

另一方面,对于 Async/Await, await 关键字会导致 JavaScript 引擎暂停 async 函数的执行,直到 Promise 被解析或拒绝。当 async 函数等待 Promise 解析时,它不会阻止调用堆栈,并且可以执行任何其他同步代码。解析承诺后, async 函数的执行将恢复,并返回承诺的结果。如果被拒绝,则会引发错误值。

更多内容请点👉:开发者网站讨论社区


http://www.ppmy.cn/news/1257972.html

相关文章

QtCreator调试时遇到中文时会卡住

参考帖子: https://bbs.csdn.net/topics/604917742 例如: 1.代码中有中文 btn->setText("开始"); 2.注释中有中文 btn->setText("strart"); // 开始

每日一练 | 华为认证真题练习Day142

1、路由器的主要功能,以下说法错误的是?(多选) A. 通过多种协议建立路由表 B. 根据路由表指导数据转发 C. 根据收到数据包的源IP地址进行转发 D. 实现相同网段设备之间相互通信 2、管理员发现无法通过TFTP传输文件到华为AR200…

Hive_Spark_left()函数

在SQL中,LEFT()函数是一个字符串函数,用于从一个字符串的左侧开始提取指定数量的字符。这个函数通常接受两个参数: 第一个参数是要从中提取字符的字符串。 第二个参数指定要提取的字符数。 语法如下: LEFT(string_expression,…

Apache Hive3.1.3 遇到DATE_FORMAT转换2021年12月格式的问题

比如:需要将时间2021-12-28 00:00:00转换成2021-12的格式,用date_format会将2021-12转换成2022-12的问题。 解决方法: 方式一:大写的‘Y’换成‘y’ 方式二:字符串截取,substr 本博主推荐方式一&#xf…

TensoRF: Tensorial Radiance Fields

TensoRF: Tensorial Radiance Fields TensoRF是ECCV2022一个非常有特色的工作。作者在三维场景表示中引入张量分解的技术,将4D张量分解成多个低秩的张量分量,实现更好的重建质量、更快的重建速度、更小的模型体积。 文章目录 TensoRF: Tensorial Radian…

【Classic Chinese】

Classic Culture Poetry Poetry 偈一 唐 . 惠能 菩提本无树,明镜亦非台;本来无一物,何处惹尘埃?

vue创建项目,使用可视化界面安装插件

安装项目: vue create vue-app 选择默认配置就行,也可以按需选择自定义配置 vue ui通过可视化管理项目 通过可视化安装全家桶插件

跨网文件摆渡系统:安全、可控的数字传输桥梁

在企业高度信息化的时代,数据的流通与共享已经成为企业、组织乃至个人之间不可或缺的沟通方式。然而,在数据流通的过程中,我们经常会遇到各种难题和挑战,尤其是当涉及到不同网络环境之间的文件传输。这不仅需要保证文件的安全性&a…