实现一个简易版的Promise

实现一个简易版的Promise。这个实现涵盖了Promise的基本功能,包括状态管理、then方法、以及异步解析。以下是代码实现:

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

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

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

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

  then(onFulfilled, onRejected) {
    onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : value => value;
    onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason };

    return new MyPromise((resolve, reject) => {
      const fulfilledHandler = (value) => {
        try {
          const result = onFulfilled(value);
          resolve(result);
        } catch (error) {
          reject(error);
        }
      };

      const rejectedHandler = (reason) => {
        try {
          const result = onRejected(reason);
          resolve(result);
        } catch (error) {
          reject(error);
        }
      };

      if (this.state === 'fulfilled') {
        setTimeout(() => fulfilledHandler(this.value), 0);
      } else if (this.state === 'rejected') {
        setTimeout(() => rejectedHandler(this.reason), 0);
      } else if (this.state === 'pending') {
        this.onFulfilledCallbacks.push(fulfilledHandler);
        this.onRejectedCallbacks.push(rejectedHandler);
      }
    });
  }
}

这个实现包含以下主要特性:

  1. 状态管理: Promise有三种状态 - pending, fulfilled, 和 rejected。
  2. 值存储: 保存fulfilled状态的值或rejected状态的原因。
  3. then方法: 允许链式调用和异步操作。
  4. 回调队列: 当Promise还在pending状态时,存储then中的回调。
  5. 异常处理: 捕获执行器和回调中的错误。

使用示例:

const p = new MyPromise((resolve, reject) => {
  setTimeout(() => {
    resolve('Success!');
  }, 1000);
});

p.then(
  value => console.log(value),
  reason => console.error(reason)
).then(
  () => console.log('This runs after the first then')
);

关注微信公众号温暖前端,不定期分享前端知识点和前端资料↓↓↓

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaScript 中的 `Promise` 对象是用来处理异步操作的一种数据结构。它表示了一个尚未完成的任务,并允诺在将来提供一个结果。Promise 可以处于三种状态之一:pending(待定)、fulfilled(已完成,成功) 或 rejected(已完成,失败)。在实际应用中,通常会通过 `then` 和 `catch` 方法来链式处理这些状态变化。 ### 创建简单的 Promise 构造函数 下面是一个基础的 `Promise` 的实现示例: ```javascript function simplePromise(value) { return new Promise(function(resolve, reject) { // 根据值判断是否是已经成功的状态 if (value === true) { resolve("任务成功!"); } else { reject("任务失败!"); } }); } ``` 在这个简单的 `simplePromise` 函数里,我们创建了一个 `Promise` 对象并传入了两个回调函数作为参数:`resolve` 和 `reject`。这两个函数分别用于处理 `fulfilled` 状态和 `rejected` 状态。 ### 使用简单 `Promise` 实现的功能 一旦我们有了这个构造函数,就可以使用它来包装异步操作。例如: ```javascript simplePromise(true) .then(result => console.log(result)) .catch(error => console.error(error)); ``` 上述代码将首先尝试执行 `simplePromise(true)`,由于给定的 `true` 表示成功,因此会进入 `.then` 方法并打印出 "任务成功!” 到控制台。如果在实现中使用了 `false` 或其他导致错误的情况,则会触发 `.catch` 方法并打印错误信息。 ### 扩展功能 为了更完整地体现 `Promise` 的功能,可以进一步增加返回结果、处理多个状态等特性。比如添加返回值的能力以及 `finally` 方法供清理操作使用: ```javascript class SimplePromise { constructor(executor) { this.resolve = null; this.reject = null; this.state = 'pending'; this.value = null; const resolveReject = (state, value) => { if (this.state === 'pending') { this.state = state; this.value = value; if (this.resolve && this.reject) { this.resolve(this.value); this.reject = undefined; this.resolve = undefined; } } }; try { executor(resolveReject); } catch(e) { resolveReject('rejected', e); } } then(onFulfilled, onRejected) { return new SimplePromise((resolve, reject) => { this.resolve = (result) => { try { let x = onFulfilled ? onFulfilled(result) : result; if (x instanceof SimplePromise) { x.then(resolve, reject); } else { resolve(x); } } catch(e) { reject(e); } }; this.reject = error => { try { let x = onRejected ? onRejected(error) : error; if (x instanceof SimplePromise) { x.then(resolve, reject); } else { reject(x); } } catch(e) { reject(e); } }; }); } catch(rejectHandler) { return this.then(null, rejectHandler); } finally(callback) { let promise = this; return this.then(() => callback(), () => callback()); } } // 使用新的 Promise 类 new SimplePromise((resolve, reject) => { setTimeout(() => resolve('Hello'), 500); }).then(result => console.log(result)).catch(err => console.error(err)); ``` 在这个版本中,我们引入了类封装来简化 API 和增强功能,如允许返回值、链式调用 `then` 方法和通过 `finally` 完成清理操作。 --- ### 相关问题 - JavaScript Promise 的基本概念: 1. **Promise 的状态是什么?** 分别解释它们的意义及如何从 `pending` 转变到其他状态。 2. **简述 `.then()` 和 `.catch()` 方法的作用以及区别。** 3. **在什么情况下使用 `.finally()` 方法?给出一个场景说明它的用途。** 通过这些问题,你可以更深入地理解 Promise 结构和其在 JavaScript 异步编程中的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温暖前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值