JavaScript使用Promise处理异步操作用法示例

在 JavaScript 中,Promise 是一种用于处理异步操作的机制。它代表了一个在未来可能会完成或失败的操作,并且允许你对这些操作进行链式处理。

JavaScript使用Promise处理异步操作用法示例

Promise 可以有三种状态:

  • Pending(待定):初始状态,操作尚未完成。
  • Fulfilled(已兑现):操作成功完成。
  • Rejected(已拒绝):操作失败。

Promise 基本用法

Promise 主要有以下几个方法:

then():当 Promise 状态为 Fulfilled 时,执行成功回调。

catch():当 Promise 状态为 Rejected 时,执行失败回调。

finally():无论 Promise 状态如何,都会执行的回调。

示例1:创建一个 Promise

const myPromise = new Promise((resolve, reject) => {
  let success = true;  // 模拟异步操作成功或失败

  if (success) {
    resolve("操作成功");  // 如果操作成功,调用 resolve()
  } else {
    reject("操作失败");   // 如果操作失败,调用 reject()
  }
});

// 使用 then() 处理成功的情况
myPromise.then((result) => {
  console.log(result);  // 输出: 操作成功
})
// 使用 catch() 处理失败的情况
.catch((error) => {
  console.error(error);  // 输出: 操作失败
});

myPromise 是一个异步操作,如果 success 为 true,则执行 resolve(),否则执行 reject()。

示例2:链式调用 then()

const myPromise = new Promise((resolve, reject) => {
  let success = true;
  if (success) {
    resolve("操作成功");
  } else {
    reject("操作失败");
  }
});

myPromise
  .then((result) => {
    console.log(result);  // 输出: 操作成功
    return "继续操作";   // 返回一个新的 Promise 或值,供下一个 then() 使用
  })
  .then((message) => {
    console.log(message);  // 输出: 继续操作
  })
  .catch((error) => {
    console.error(error);  // 处理任何异常
  });

在这个例子中,then() 返回了一个新的值("继续操作"),这个值会被下一个 then() 处理。

示例3:Promise.all() 批量处理多个异步操作

Promise.all() 接受一个数组作为参数,当所有的 Promise 都成功时,返回一个新的 Promise,否则返回失败的 Promise。

const promise1 = new Promise((resolve) => setTimeout(resolve, 1000, "结果1"));
const promise2 = new Promise((resolve) => setTimeout(resolve, 2000, "结果2"));
const promise3 = new Promise((resolve) => setTimeout(resolve, 3000, "结果3"));

Promise.all([promise1, promise2, promise3])
  .then((results) => {
    console.log(results);  // 输出: ["结果1", "结果2", "结果3"]
  })
  .catch((error) => {
    console.error(error);  // 如果有一个 Promise 失败,进入 catch
  });

Promise.all() 等待所有的 Promise 都成功时,返回一个包含每个 Promise 结果的数组。如果其中一个 Promise 失败,整个 Promise.all() 会失败并进入 catch()。

示例4:Promise.race() 竞争条件

Promise.race() 接受一个 Promise 数组,返回第一个完成(无论是成功还是失败)的 Promise。

const promise1 = new Promise((resolve) => setTimeout(resolve, 2000, "结果1"));
const promise2 = new Promise((resolve) => setTimeout(resolve, 1000, "结果2"));

Promise.race([promise1, promise2])
  .then((result) => {
    console.log(result);  // 输出: 结果2,因为它先完成
  })
  .catch((error) => {
    console.error(error);
  });

Promise.race() 会返回第一个完成的 Promise,无论其是成功还是失败。

示例5:finally() 最终处理

无论 Promise 是成功还是失败,finally() 都会执行,通常用于清理工作(如关闭加载动画等)。

const myPromise = new Promise((resolve, reject) => {
  let success = true;
  if (success) {
    resolve("操作成功");
  } else {
    reject("操作失败");
  }
});

myPromise
  .then((result) => {
    console.log(result);  // 输出: 操作成功
  })
  .catch((error) => {
    console.error(error);  // 输出: 操作失败
  })
  .finally(() => {
    console.log("无论成功还是失败,都会执行这里");  // 总会输出这行
  });

finally() 不关心 Promise 的状态,它总会被执行,用于清理工作。

总结

Promise 是 JavaScript 用于处理异步操作的对象。

resolve() 用于标记异步操作成功,reject() 用于标记失败。

使用 then() 处理成功的结果,catch() 处理失败的情况,finally() 总会执行。

可以通过 Promise.all() 和 Promise.race() 来处理多个异步操作的组合和竞争。

通过使用 Promise,可以更清晰地组织和处理 JavaScript 中的异步代码,避免回调地狱问题。

评论