你了解 ES6 中的 Promise 吗?

Promise 是 ES6 提供的一种用于处理 JavaScript 异步操作的 API,解决了回调地狱等问题。

异步编程 中等 ES6 Promise JavaScript

Promise 是 ES6(ECMAScript 2015)引入的一种异步编程解决方案,通过封装异步操作的管理逻辑,解决传统回调函数的深层嵌套问题(俗称“回调地狱”),提升代码的可读性与可维护性。其主要特性和工作机制如下:

解决的问题

  1. 回调地狱(Callback Hell):早期使用嵌套式回调处理多个异步操作的连续依赖时会导致代码层级深度过高,可读性低和维护成本高。使用 .then() 可以实现链式调用,扁平化代码结构。
  2. 状态不可控:回调函数中无法统一处理异步操作的成功或失败状态,Promise 通过明确的状态定义提供了可靠的状态管理机制。

核心概念

  1. 三种状态
    • pending(进行中):初始状态。
    • fulfilled(已兑现):表示操作成功完成。
    • rejected(已拒绝):表示操作失败。
      状态只能从 pending 转变为 fulfilledrejected,转变后不可再变(即决议结果持久化)。
  2. 创建 Promise
    通过 new Promise() 构造函数生成实例,其回调参数为 resolve()(成功处理)和 reject()(失败处理):
    const promise = new Promise((resolve, reject) => {
      setTimeout(() => {
        if (/* 操作成功 */) resolve('Success'); // 设置 fulfilled 状态
        else reject('Failure');               // 设置 rejected 状态
      }, 1000);
    });
    

核心方法与使用

  • .then():用于定义成功或失败的回调函数,返回新的 Promise 支持链式操作:
    promise
      .then(value => console.log(value))  // 成功处理(value='Success')
      .catch(error => console.log(error)); // 可链式定义失败处理(替代拒绝回调参数) 
    
  • .catch():专用于失败状态的捕获和处理:
    promise.catch(error => console.log('失败:', error));
    
  • 静态方法(多实例调度)
    • Promise.all():等待所有输入 Promise 成功后才触发 .then(),任一失败即触发 .catch(),适合并行操作。
    • Promise.race():基于首个完成的 Promise 状态(成功/失败)决定响应,适合同步优先级任务。

优缺点总结

  • 优: 消除回调嵌套、统一异步错误处理机制、支持批量操作控制(通过 .all()等)。
  • 缺: 一旦创建执行即不可中途取消;.finally()为终步统一执行逻辑可用。