JavaScript异步编程中Promise和AsyncAwait该怎么用

来源:AI技术网作者:小诸葛头衔:草根站长
导读:本期聚焦于小伙伴创作的《JavaScript异步编程中Promise和AsyncAwait该怎么用》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《JavaScript异步编程中Promise和AsyncAwait该怎么用》有用,将其分享出去将是对创作者最好的鼓励。

JavaScript是单线程语言,为了避免耗时操作阻塞主线程,异步编程成为处理网络请求、文件读取等场景的必备能力。Promise和AsyncAwait是ES6及之后推出的异步解决方案,逐步替代了传统的回调函数写法。

JavaScript异步编程中Promise和AsyncAwait该怎么用

Promise基础用法

Promise是一个代表异步操作最终完成或失败的对象,它有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败),状态一旦改变就不会再变。

创建Promise实例

通过new Promise()构造函数创建实例,构造函数接收一个执行器函数,该函数有两个参数:resolvereject,分别用于将Promise状态改为成功和失败。

// 创建一个模拟异步请求的Promise
const asyncRequest = new Promise((resolve, reject) => {
  // 模拟2秒后返回结果
  setTimeout(() => {
    const success = true;
    if (success) {
      resolve({ code: 200, data: '请求成功' }); // 成功时调用resolve
    } else {
      reject(new Error('请求失败')); // 失败时调用reject
    }
  }, 2000);
});

Promise实例方法

Promise实例提供了thencatchfinally三个常用方法处理异步结果。

  • then:接收两个可选参数,第一个是成功回调,第二个是失败回调,返回一个新的Promise实例,支持链式调用。
  • catch:用于捕获Promise链中的错误,等价于then(null, rejection)
  • finally:无论Promise成功还是失败,都会执行其中的回调,适合做清理操作。
asyncRequest
  .then((res) => {
    console.log('成功结果:', res);
    return res.data; // 返回值会作为下一个then的参数
  })
  .then((data) => {
    console.log('处理后的数据:', data);
  })
  .catch((err) => {
    console.log('捕获错误:', err.message);
  })
  .finally(() => {
    console.log('请求结束,执行清理操作');
  });

Promise静态方法

Promise还提供了多个静态方法处理多个异步操作的场景:

方法名作用
Promise.all()接收多个Promise实例,所有实例都成功才返回成功,有一个失败就直接返回失败
Promise.race()接收多个Promise实例,返回最先改变状态的实例的结果
Promise.allSettled()接收多个Promise实例,所有实例都改变状态后返回每个实例的状态和结果
Promise.any()接收多个Promise实例,有一个成功就返回成功,全部失败才返回失败
// Promise.all示例:同时请求两个接口,都成功才执行后续操作
const request1 = fetch('https://ipipp.com/api/data1');
const request2 = fetch('https://ipipp.com/api/data2');

Promise.all([request1, request2])
  .then(([res1, res2]) => {
    console.log('两个请求都成功', res1, res2);
  })
  .catch((err) => {
    console.log('至少一个请求失败', err);
  });

AsyncAwait用法

AsyncAwait是建立在Promise之上的语法糖,让异步代码看起来像同步代码,更易读易写。async用于声明一个异步函数,await用于等待一个Promise实例的状态改变。

基本语法

在函数前添加async关键字,函数就会返回一个Promise实例。在async函数内部,使用await等待Promise的结果,await会暂停函数执行,直到Promise状态改变。

// 用AsyncAwait改写前面的asyncRequest调用
async function handleRequest() {
  try {
    const res = await asyncRequest; // 等待Promise成功,获取resolve的值
    console.log('成功结果:', res);
    const data = res.data;
    console.log('处理后的数据:', data);
  } catch (err) {
    console.log('捕获错误:', err.message); // 捕获reject的错误
  } finally {
    console.log('请求结束,执行清理操作');
  }
}

handleRequest();

注意事项

  • await只能在async函数内部使用,否则会报错。
  • await后面如果不是Promise实例,会被自动转换为状态为fulfilled的Promise。
  • 多个无依赖的异步操作不要顺序使用await,会导致不必要的等待,可以用Promise.all配合await优化。
// 错误写法:两个无依赖的请求顺序执行,耗时是两个请求的总和
async function wrongRequest() {
  const res1 = await fetch('https://ipipp.com/api/data1');
  const res2 = await fetch('https://ipipp.com/api/data2');
  console.log(res1, res2);
}

// 正确写法:同时发起请求,耗时取最长的那个
async function rightRequest() {
  const [res1, res2] = await Promise.all([
    fetch('https://ipipp.com/api/data1'),
    fetch('https://ipipp.com/api/data2')
  ]);
  console.log(res1, res2);
}

Promise和AsyncAwait的差异

两者本质都是基于Promise的异步解决方案,核心差异在于写法和使用场景:

  • Promise通过链式调用处理异步,AsyncAwait用同步写法处理异步,后者代码可读性更高。
  • Promise的错误处理可以用catch捕获整个链的错误,AsyncAwait需要用try...catch捕获错误。
  • 处理多个并行的无依赖异步操作时,Promise.all配合AsyncAwait是最优选择。
  • 在不需要等待结果的场景下,Promise的then写法更简洁,不需要声明async函数。
实际开发中,推荐优先使用AsyncAwait处理异步逻辑,遇到复杂的多个异步操作组合场景,结合Promise的静态方法使用,既能保证代码可读性,也能满足各种异步处理需求。

JavaScript异步编程PromiseAsyncAwait修改时间:2026-07-23 16:27:31

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。