Promise详解:从回调地狱到优雅异步

Promise 详解

为什么需要 Promise

在实际开发中,我们经常需要处理异步操作链。例如:

  1. 通过 AJAX 请求获取用户 ID
  2. 根据 ID 请求用户名
  3. 根据用户名获取邮箱地址

使用传统回调函数会导致"回调地狱"(回调函数中嵌套回调函数),而 Promise 正是为了解决这个问题而诞生的。

Promise 基本使用

语法

Promise 接受一个函数作为参数,该函数包含两个参数:

  • resolve: 成功回调函数
  • reject: 失败回调函数

Promise 实例

每个 Promise 实例都有两个关键属性:

  • state: 表示当前状态
  • result: 存储操作结果

Promise 的三种状态

  1. pending (等待中)
  2. fulfilled (已成功)
  3. rejected (已失败)

状态改变方法

  • resolve(): 将状态改为 fulfilled
  • reject(): 将状态改为 rejected

注意:Promise 的状态改变是一次性的,不可逆转。

Promise 的方法

then 方法

  • 通过形参获取 Promise 对象的结果
  • 返回一个新的 Promise 实例(初始状态为 pending)
  • 如果 Promise 状态未改变,不会执行 then 中的方法
  • 可以通过 return 将返回的 Promise 实例状态改为 fulfilled
  • 如果代码出错,返回的 Promise 实例状态会改为 rejected

catch 方法

用于捕获和处理错误

async 和 await

async 函数

  • 返回值总是 Promise 对象
  • 结果由函数执行的返回值决定:
    • 返回非 Promise 值:成功状态
    • 返回 Promise 对象:继承该 Promise 的状态
    • 抛出异常:失败状态
javascript 复制代码
async function main() {
  // 1. 返回非 Promise 值(成功状态)
  // return "字符串/数字/布尔值";
  
  // 2. 返回 Promise 对象
  return new Promise((resolve, reject) => {
    resolve("OK"); // 成功状态
    // reject("Err"); // 失败状态
  });
  
  // 3. 抛出异常(失败状态)
  // throw "oh No";
}

await 表达式

  • 右侧表达式通常是 Promise 对象
  • 如果是 Promise 对象,返回其成功值
  • 如果是其他值,直接返回该值

注意事项:

  1. await 必须用在 async 函数中
  2. 如果 await 的 Promise 失败,会抛出异常
  3. 建议使用 try...catch 捕获错误

实践示例

javascript 复制代码
const fs = require("fs");
const util = require("util");
const mineReadFile = util.promisify(fs.readFile); // 转换为 Promise 形式

async function main() {
  try {
    let data1 = await mineReadFile("./resource/1.html");
    let data2 = await mineReadFile("./resource/2.html");
    let data3 = await mineReadFile("./resource/3.html");
  } catch(e) {
    console.log(e);
  }
}
相关推荐
Mr Xu_1 小时前
【Vue3 + ECharts 实战】正确使用 showLoading、resize 与 dispose 避免内存泄漏
前端·信息可视化·vue·echarts
0思必得01 小时前
[Web自动化] Selenium设置相关执行文件路径
前端·爬虫·python·selenium·自动化
雯0609~1 小时前
hiprint:实现项目部署与打印1-官网提供普通html版本
前端·html
yuezhilangniao1 小时前
AI智能体全栈开发工程化规范 备忘 ~ fastAPI+Next.js
javascript·人工智能·fastapi
不绝1912 小时前
UGUI——进阶篇
前端
Exquisite.2 小时前
企业高性能web服务器(4)
运维·服务器·前端·网络·mysql
铅笔侠_小龙虾2 小时前
Flutter Demo
开发语言·javascript·flutter
2501_944525543 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
2601_949857433 小时前
Flutter for OpenHarmony Web开发助手App实战:快捷键参考
前端·flutter
wangdaoyin20103 小时前
若依vue2前后端分离集成flowable
开发语言·前端·javascript