ES6-Promise用法

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


一、Promise 核心概念

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

1. 状态机

Promise 有三种状态:

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

状态转换:
PendingFulfilled(触发 resolve

PendingRejected(触发 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 语法、复杂链式调用),可进一步说明需求!

相关推荐
万少8 小时前
HarmonyOS 开发必会 5 种 Builder 详解
前端·harmonyos
橙序员小站11 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
炫饭第一名13 小时前
速通Canvas指北🦮——基础入门篇
前端·javascript·程序员
王晓枫13 小时前
flutter接入三方库运行报错:Error running pod install
前端·flutter
符方昊13 小时前
React 19 对比 React 16 新特性解析
前端·react.js
ssshooter13 小时前
又被 Safari 差异坑了:textContent 拿到的值居然没换行?
前端
曲折14 小时前
Cesium-气象要素PNG色斑图叠加
前端·cesium
Forever7_14 小时前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
Angelial14 小时前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js
jiayu14 小时前
Angular学习笔记24:Angular 响应式表单 FormArray 与 FormGroup 相互嵌套
前端