ES6-Promise用法

关于 Promise,这通常指编程领域(尤其是 JavaScript)中用于处理异步操作的机制。以下是详细解析:


一、Promise 核心概念

Promise 是 ES6 引入的对象,用于表示异步操作的最终完成(或失败)及其结果值。它解决了传统回调函数导致的「回调地狱」问题。

1. 状态机

Promise 有三种状态:

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

状态转换:
Pending → Fulfilled(触发 resolve)

或 Pending → Rejected(触发 reject)。


二、基础语法与示例

1. 创建 Promise
javascript 复制代码
const myPromise = new Promise((resolve, reject) => {
  // 异步操作逻辑
  const success = true; // 模拟结果
  if (success) {
    resolve("操作成功!"); // 触发 Fulfilled 状态
  } else {
    reject("操作失败!"); // 触发 Rejected 状态
  }
});
2. 链式调用 .then()、.catch()、.finally()
javascript 复制代码
myPromise
  .then((result) => {
    console.log("成功:", result); // 输出: "操作成功!"
  })
  .catch((error) => {
    console.error("失败:", error);
  })
  .finally(() => {
    console.log("无论成功/失败都会执行");
  });

三、Promise 常用方法

1. Promise.all([promise1, promise2, ...])
  • 作用:等待所有 Promise 完成。
  • 返回:一个新的 Promise,全部成功则返回结果数组;任一失败则返回第一个失败原因。
javascript 复制代码
const p1 = Promise.resolve("数据A");
const p2 = new Promise((resolve) => setTimeout(() => resolve("数据B"), 100));
Promise.all([p1, p2])
  .then((results) => console.log(results)) // 输出: ["数据A", "数据B"]
  .catch((err) => console.error(err));
2. Promise.race([promise1, promise2, ...])
  • 作用:哪个 Promise 先完成(成功/失败),就采用它的结果。
javascript 复制代码
const fastPromise = new Promise((resolve) => setTimeout(() => resolve("快"), 100));
const slowPromise = new Promise((resolve) => setTimeout(() => resolve("慢"), 500));
Promise.race([fastPromise, slowPromise])
  .then((result) => console.log(result)); // 输出: "快"

四、实际应用场景

1. 异步数据请求
javascript 复制代码
function fetchData(url) {
  return new Promise((resolve, reject) => {
    fetch(url)
      .then((response) => response.json())
      .then((data) => resolve(data))
      .catch((error) => reject(error));
  });
}

// 使用示例
fetchData("https://api.example.com/data")
  .then((data) => console.log(data))
  .catch((err) => console.error("请求失败:", err));
2. 串联异步操作
javascript 复制代码
step1()
  .then((result1) => step2(result1))
  .then((result2) => step3(result2))
  .catch((error) => console.error("步骤失败:", error));

五、常见问题

1. 如何将 Callback 转为 Promise?
javascript 复制代码
function callbackStyleFunction(param, callback) {
  // 假设这是第三方库的回调函数
  callback(null, "数据");
}

// 封装为 Promise
const promisified = (param) => 
  new Promise((resolve, reject) => 
    callbackStyleFunction(param, (err, data) => {
      if (err) reject(err);
      else resolve(data);
    })
  );
2. 如何处理多个 Promise 竞争?
javascript 复制代码
// 使用 Promise.race 实现超时控制
function withTimeout(promise, ms) {
  return Promise.race([
    promise,
    new Promise((_, reject) => 
      setTimeout(() => reject("超时"), ms)
    )
  ]);
}

如果需要更具体的场景示例(如 async/await 语法、复杂链式调用),可进一步说明需求!

相关推荐
@大迁世界1 天前
Firefox 本地模式:localhost 再见了 ?
前端·架构
米米商聊1 天前
同名附件为什么被 Map 覆盖?重复键与一对多索引
前端·javascript
echome8881 天前
Python 异常处理:try、else、finally 的正确搭配
开发语言·前端·python·异常处理·编程技巧
时间的情敌1 天前
OpenLayers 实战|Vue3 + OpenLayers 完整工程案例(加载天地图、要素、弹窗、绘制、WFS)
前端·openlayers
陈随易1 天前
下载神器!Motrix 停更三年后重写回归
前端·后端·程序员
前端的日常1 天前
一个人+AI做情侣食谱小程序,0 费用的服务器
前端·后端
计算机魔术师1 天前
谷歌搜索广告踩刹车,AI广告成为救命稻草
前端
总要学点什么1 天前
第81篇:数据可视化-PM2.5分布——让圆点的胖瘦替每座城市报出浓度
前端·信息可视化·echarts·cesium·空间分析
IT_陈寒1 天前
Vue的v-for里用了个临时变量,页面直接挂了
前端·人工智能·后端
hunter_0761 天前
一次 iOS 真机签名 409 的完整排查:证书、设备、描述文件为什么总是"对不上"
前端