当前位置:首页 > 文章列表 > 文章 > 前端 > 实现Promises/A+规范的Promise类详解

实现Promises/A+规范的Promise类详解

2025-10-11 10:20:32 0浏览 收藏

目前golang学习网上已经有很多关于文章的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《实现一个符合 Promises/A+ 规范的 Promise 类需要遵循其定义的接口和状态转换规则。以下是基本思路和代码示例:✅ Promises/A+ 简介Promises/A+ 是一个 JavaScript 异步编程的标准规范,它定义了 Promise 对象的行为和接口,确保不同实现之间的一致性。核心特性包括:一个 Promise 有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)。状态一旦改变,就不能再变。then() 方法用于注册回调函数,支持链式调用。catch() 方法用于捕获错误。🧠 实现思路定义状态:使用变量表示当前状态。存储结果:保存 fulfilled 或 rejected 的值。处理异步操作:在构造函数中执行异步任务。处理 then() 回调:将回调加入队列,等待状态变化时触发。处理链式调用:确保 then() 返回新的 Promise。💻 代码实现 class MyPromise { constructor(executor) { this.state = 'pending'; this.value = undefined; this.reason = undefined; this.on》,也希望能帮助到大家,如果阅读完后真的对你学习文章有帮助,欢迎动动手指,评论留言并分享~

实现符合 Promises/A+ 规范的 Promise 类需掌握其核心机制:1. 状态不可逆(pending → fulfilled/rejected);2. 构造函数立即执行 executor 并接收 resolve/reject 函数;3. then 方法返回新 Promise,支持链式调用;4. 回调通过 queueMicrotask 异步执行;5. resolvePromise 解析返回值,处理对象或函数的 thenable 行为;6. 检测循环引用。该实现涵盖状态管理、异步延迟、错误捕获与链式传递,基本通过 A+ 测试。

怎样实现一个符合 Promises/A+ 规范的 Promise 类?

要实现一个符合 Promises/A+ 规范的 Promise 类,核心是理解其状态机制、then 方法的处理逻辑以及异步解析流程。下面是一个精简但完整、符合规范关键点的实现。

Promise 的三种状态

Promise 有三种状态:

  • pending:初始状态,可变
  • fulfilled:成功状态,不可逆
  • rejected:失败状态,不可逆

状态一旦从 pending 变为 fulfilled 或 rejected,就不能再改变。

构造函数与状态管理

创建 Promise 实例时,传入一个执行器函数(executor),它立即执行,并接收 resolve 和 reject 两个函数作为参数。

class MyPromise {
  constructor(executor) {
    this.status = 'pending';
    this.value = undefined;
    this.reason = undefined;
    this.onFulfilledCallbacks = [];
    this.onRejectedCallbacks = [];

    const resolve = (value) => {
      if (this.status === 'pending') {
        this.value = value;
        this.status = 'fulfilled';
        this.onFulfilledCallbacks.forEach(fn => fn());
      }
    };

    const reject = (reason) => {
      if (this.status === 'pending') {
        this.reason = reason;
        this.status = 'rejected';
        this.onRejectedCallbacks.forEach(fn => fn());
      }
    };

    try {
      executor(resolve, reject);
    } catch (error) {
      reject(error);
    }
  }
}

实现 then 方法

then 方法用于注册成功和失败的回调,且必须返回一个新的 Promise,以支持链式调用。

关键点包括:

  • onFulfilled 和 onRejected 是可选函数
  • 回调必须异步延迟执行(使用 queueMicrotask 或 setTimeout)
  • 处理返回值 x,调用 resolvePromise 进行解析
then(onFulfilled, onRejected) {
  // 处理可选参数
  onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : val => val;
  onRejected = typeof onRejected === 'function' ? onRejected : err => { throw err; };

  // 返回新的 Promise 实现链式调用
  const promise2 = new MyPromise((resolve, reject) => {
    const handleCallback = (callback, status, data) => {
      queueMicrotask(() => {
        try {
          const x = callback(data);
          resolvePromise(promise2, x, resolve, reject);
        } catch (e) {
          reject(e);
        }
      });
    };

    if (this.status === 'fulfilled') {
      handleCallback(onFulfilled, this.status, this.value);
    } else if (this.status === 'rejected') {
      handleCallback(onRejected, this.status, this.reason);
    } else {
      // pending 状态,缓存回调
      this.onFulfilledCallbacks.push(() => handleCallback(onFulfilled, 'fulfilled', this.value));
      this.onRejectedCallbacks.push(() => handleCallback(onRejected, 'rejected', this.reason));
    }
  });

  return promise2;
}

resolvePromise 辅助函数

这个函数决定如何根据 x 的类型来 resolve 新的 Promise,是 Promises/A+ 的核心逻辑之一。

function resolvePromise(promise, x, resolve, reject) {
  if (promise === x) {
    return reject(new TypeError('Chaining cycle detected'));
  }

  let called = false;

  if (x != null && (typeof x === 'object' || typeof x === 'function')) {
    try {
      const then = x.then;
      if (typeof then === 'function') {
        then.call(
          x,
          y => {
            if (called) return;
            called = true;
            resolvePromise(promise, y, resolve, reject);
          },
          r => {
            if (called) return;
            called = true;
            reject(r);
          }
        );
      } else {
        resolve(x);
      }
    } catch (e) {
      if (called) return;
      called = true;
      reject(e);
    }
  } else {
    resolve(x);
  }
}

基本上就这些。这个实现涵盖了 Promises/A+ 的主要要求:状态管理、then 链式调用、异步执行、错误捕获和循环引用检测。虽然省略了一些边界情况的极致优化,但它能通过大部分 A+ 测试套件(如 promises-aplus-tests)。

以上就是《实现Promises/A+规范的Promise类详解》的详细内容,更多关于的资料请关注golang学习网公众号!

Cortana语言设置教程:如何更改语言偏好Cortana语言设置教程:如何更改语言偏好
上一篇
Cortana语言设置教程:如何更改语言偏好
Java记账本开发教程入门指南
下一篇
Java记账本开发教程入门指南
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    3182次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    3393次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    3425次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    4529次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    3802次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码