速通!Promise异步编程!以及Async/Await解析

Promise介绍

Promise 是 JavaScript 中处理异步操作的核心机制,用于解决回调地狱(Callback Hell)问题。它表示一个异步操作的最终完成(或失败)及其结果值。

其中,它的构造函数是同步执行的,then / catch 方法是异步执行的。Promise创建后里面的函数会立即执行,构造函数中的resolve(.then)和reject(.catch)只有第一次执行有效,即Promise状态一旦改变就不能改变。

三种状态

  1. Pending(待定):初始状态,操作尚未完成

  2. Fulfilled(已兑现):操作成功完成

  3. Rejected(已拒绝):操作失败

状态一旦改变(fulfilled 或 rejected)就不可逆。

pedding初始状态

调用promise后,就会处于初始状态,此时resolve和reject均未执行,类似于接口的请求中

Fulfilled操作成功

resolve执行之后,promise则会从pedding变成fulfilled,其返回值可在.then方法的参数中获取到,

Rejected操作失败

rejected执行之后,promise则会从pedding变成Rejected,其错误信息可在.catch方法的参数中获取到

.finally()方法 无论Promise执行成功或失败,都会执行

Promise的常用方法

1. Promise.resolve()

创建立即成功的 Promise

const resolved = Promise.resolve("成功值");

// 等同于
new Promise(resolve => resolve("成功值"));

//或 
const promise = new Promise((resolve, reject) => {
  resolve("成功值");
}
promise.then((res) => {
  console.log(res); //"成功值"
});

2. Promise.reject()

创建立即失败的 Promise

const resolved = Promise.reject("失败");

// 等同于
new Promise(resolve => reject("失败"));

//或 
const promise = new Promise((resolve, reject) => {
  reject("失败");
}

p.then((res) => {
  console.log(res); //未执行
}).catch((error) => {
  console.log(error); //"失败"
})

3. Promise.all()

并行执行多个 Promise,全部成功才算成功

const p1 = Promise.resolve(1);
const p2 = Promise.resolve(2);

Promise.all([p1, p2])
  .then(values => console.log(values)) // [1, 2]
  .catch(error => console.error(error));
4. Promise.allSettled()

等待所有 Promise 完成(无论成功失败),返回一个包含每个 Promise 解决状态的对象数组。

Promise.allSettled([p1, p2])
  .then(results => {
    results.forEach(result => 
      console.log(result.status) // "fulfilled" 或 "rejected"
    )
  });
5. Promise.race()

返回第一个完成的 Promise(无论成功失败)

const fast = new Promise(resolve => 
  setTimeout(() => resolve("快完成"), 100)
);

const slow = new Promise(resolve => 
  setTimeout(() => resolve("慢完成"), 500)
);

Promise.race([fast, slow])
  .then(winner => console.log(winner)); // "快完成"
6. Promise.any()

返回第一个成功的 Promise

const failFast = Promise.reject("错误");
const slowSuccess = new Promise(resolve => 
  setTimeout(() => resolve("成功"), 500)
);

Promise.any([failFast, slowSuccess])
  .then(firstSuccess => console.log(firstSuccess)); // "成功"

目前常用的处理异步的方法

  • Promise对象(上述方法),通过.then .catch  .finally方法
  •  Async/Await(首选现代方案)

Async/Await

Async/Await 是 ES2017 引入的 JavaScript 异步编程方案,它基于 Promise 构建,通过更直观的语法让异步代码拥有同步代码的可读性。

async 函数

  • 声明一个函数始终返回 Promise

  • 普通返回值会被自动包装为 resolved Promise

await 表达式

  • 只能在 async 函数内部使用

  • 暂停函数执行,等待 Promise 解决

  • 返回 Promise 的解决值

简单应用

async function fetchData() {
  const data = await fetch('/api'); // 等待fetch完成
  return data.json();
}

业务实际应用

async function processOrder(orderId) {
  try {
    // 1. 等待订单获取
    const order = await getOrder(orderId);
    
    // 2. 并行获取用户和产品信息
    const [user, product] = await Promise.all([
      getUser(order.userId),
      getProduct(order.productId)
    ]);
    
    // 3. 顺序处理
    const payment = await processPayment(order);
    await sendConfirmation(user.email);
    
    return { status: 'completed', user, product };
  } catch (error) {
    // 统一错误处理
    await logError(error);
    throw new OrderError('处理订单失败');
  } finally {
    // 4. 最终清理
    releaseResources();
  }
}

其中

  • 使用 try/catch 捕获同步错误和 rejected Promise(可以防止await错误后阻塞进程执行)

  • 并行执行:使用 Promise.all

  • 顺序执行:自然书写顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值