当前位置: 首页 > news >正文

Promise 与 async/await

一、概念定位

对比项Promiseasync / await
本质一种异步操作的对象封装机制基于 Promise 的语法糖(更直观写法)
出现版本ES6 (2015)ES8 (2017)
主要作用表示一个未来才会返回结果的异步操作让异步代码像同步代码那样书写
底层依赖无(原生实现)必须依赖 Promise
可读性相对较差(链式 then)可读性强(顺序执行)

二、语法差异

🔹使用 Promise 的写法

function getData() {return new Promise((resolve, reject) => {setTimeout(() => {resolve('数据加载完成');}, 1000);});
}getData().then(result => {console.log(result);
}).catch(err => {console.error(err);
});

🔹使用 async / await 的写法

async function loadData() {try {const result = await getData();console.log(result);} catch (err) {console.error(err);}
}loadData();

🔸可以看到:

async/await 写法更像同步流程,逻辑更直观。
但底层其实还是通过 Promise 实现的。


三、核心区别解析

维度Promiseasync / await
写法风格链式调用 .then()类同步顺序执行
错误处理.catch()try...catch
嵌套复杂度容易产生链式嵌套更加扁平易读
控制流回调链控制顺序执行(语法上阻塞)
返回值直接返回 Promise 对象自动封装为 Promise
执行机制异步回调异步 + 微任务队列控制

四、编译层面分析

例如这段 async 代码:

async function example() {const a = await doA();const b = await doB(a);return b;
}

实际上会被 Babel 编译成:

function example() {return new Promise((resolve, reject) => {doA().then(a => doB(a)).then(b => resolve(b)).catch(reject);});
}

也就是说:

async/await 并没有改变 JavaScript 的异步机制,
它只是让异步代码用同步的语法风格写出来


五、执行机制(Event Loop 层面)

Promise

  • 执行体立即执行;

  • then() 注册的回调放入 微任务队列(Microtask Queue)

  • 当前宏任务执行完后才触发 then

async / await

  • await暂停函数执行

  • 在内部注册 Promise 回调,等待其 resolve;

  • resolve 后继续执行函数体;

  • 整个过程仍是异步微任务。


六、混用场景

两者可以混合使用:

async function main() {const data1 = await fetchData1();const data2 = await fetchData2();return Promise.all([data1, data2]); // 并发执行
}

或者:

fetchData1().then(res => fetchData2(res)).then(final => console.log(final))

七、性能与风格对比

对比维度Promiseasync/await
执行性能一样(同属 Promise 机制)一样
可维护性差(链式回调)好(结构清晰)
并发控制可使用 Promise.all()需显式并发写法
异常处理.catch()try...catch

八、总结观点

结论说明
async/await 是 Promise 的语法糖并非新异步模型
两者底层机制一致都基于微任务队列执行
async/await 代码更易读更接近同步逻辑
Promise 更灵活链式并发控制场景更强(如 Promise.all

一句话总结:

Promise 是“异步机制”,
async/await 是“异步语法糖”。
它们不是竞争关系,而是前后演进的关系。

http://www.dtcms.com/a/490957.html

相关文章:

  • win11 字体变宽问题
  • 最好的做网站机械加工网站色彩搭配
  • Pytorch Yolov11目标检测+Android部署 留贴记录
  • iis 发布网站 404archlinux+wordpress
  • leetcode 2598. 执行操作后的最大 MEX 中等
  • SuperMap iObject Java实现倾斜数据预处理
  • 逻辑方阵(Logical Square)解说
  • Vue与React中动态导入的原理及实现差异解析
  • 有一个网站自己做链接获取朋友位置传媒公司属于什么行业类型
  • 服饰类电商网站建设策划昆山vi设计
  • aben.co微端侧模型价格实惠的服务商
  • 网站开发思维导图内容如何做一个单页面的网站
  • 【Qt】7.信号和槽_connect函数用法(2)
  • 网站的建设流程具体有哪些哪个合肥seo好
  • 大连公司网站建设站点与网站有什么区别
  • 高压混动救援的 “及时雨”:XRC-3363 系列救援充电器实操解析与安全要点
  • 玛哈特激光落料线:一条会“思考”的钢铁流水线
  • 《爬虫进阶之路:从模拟浏览器到破解动态加载的实战指南》
  • 现在做个人网站上海发布最新情况
  • 网站漂浮图片代码怎样把自己的网站上传
  • 如何做微网站社交电商怎么做
  • 离线安装NetData:高效监控服务器指南
  • 学习笔记-eventpp库
  • uni-app Vue 项目的规范目录结构全解
  • 在线预约导游|基于SSM+vue的在线预约导游系统(源码+数据库+文档)
  • 网站你懂我意思正能量免费网站推广策划的流程
  • 信宜网站建设公司厦门 网站建设
  • 免费建立网站的平台wordpress简体中文版下载
  • 在小车上挂载nfs
  • C# 开发最新趋势:在性能与智能的浪潮中乘风破浪