当前位置:首页 > JavaScript

promise js 实现

2026-04-05 13:18:18JavaScript

Promise 的基本实现

Promise 是 JavaScript 中处理异步操作的一种机制。以下是一个简单的 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());
      }
    };

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

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

  then(onFulfilled, onRejected) {
    const promise2 = new MyPromise((resolve, reject) => {
      if (this.state === 'fulfilled') {
        setTimeout(() => {
          try {
            const x = onFulfilled(this.value);
            resolvePromise(promise2, x, resolve, reject);
          } catch (error) {
            reject(error);
          }
        }, 0);
      } else if (this.state === 'rejected') {
        setTimeout(() => {
          try {
            const x = onRejected(this.reason);
            resolvePromise(promise2, x, resolve, reject);
          } catch (error) {
            reject(error);
          }
        }, 0);
      } else {
        this.onFulfilledCallbacks.push(() => {
          setTimeout(() => {
            try {
              const x = onFulfilled(this.value);
              resolvePromise(promise2, x, resolve, reject);
            } catch (error) {
              reject(error);
            }
          }, 0);
        });
        this.onRejectedCallbacks.push(() => {
          setTimeout(() => {
            try {
              const x = onRejected(this.reason);
              resolvePromise(promise2, x, resolve, reject);
            } catch (error) {
              reject(error);
            }
          }, 0);
        });
      }
    });

    return promise2;
  }
}

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

  if (x instanceof MyPromise) {
    x.then(resolve, reject);
  } else {
    resolve(x);
  }
}

使用示例

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

p.then((value) => {
  console.log(value); // Output: Success
  return 'Next Value';
}).then((value) => {
  console.log(value); // Output: Next Value
});

关键点说明

  1. 状态管理
    Promise 有三种状态:pendingfulfilledrejected。状态只能从 pending 转换为 fulfilledrejected,且不可逆。

  2. 异步支持
    通过 setTimeout 确保 then 回调的异步执行,符合 Promise/A+ 规范。

  3. 链式调用
    then 方法返回一个新的 Promise,支持链式调用。resolvePromise 函数处理返回值,确保链式调用的正确性。

  4. 错误处理
    executorthen 回调中捕获错误,并通过 reject 传递。

扩展方法

以下是一些常见的扩展方法实现,如 catchfinally

class MyPromise {
  // ... 其他代码同上 ...

  catch(onRejected) {
    return this.then(null, onRejected);
  }

  finally(callback) {
    return this.then(
      value => MyPromise.resolve(callback()).then(() => value),
      reason => MyPromise.resolve(callback()).then(() => { throw reason; })
    );
  }

  static resolve(value) {
    return new MyPromise(resolve => resolve(value));
  }

  static reject(reason) {
    return new MyPromise((_, reject) => reject(reason));
  }
}

静态方法实现

实现 Promise.allPromise.race 等静态方法。

class MyPromise {
  // ... 其他代码同上 ...

  static all(promises) {
    return new MyPromise((resolve, reject) => {
      const results = [];
      let completed = 0;

      promises.forEach((promise, index) => {
        MyPromise.resolve(promise).then(
          value => {
            results[index] = value;
            completed++;
            if (completed === promises.length) {
              resolve(results);
            }
          },
          reject
        );
      });
    });
  }

  static race(promises) {
    return new MyPromise((resolve, reject) => {
      promises.forEach(promise => {
        MyPromise.resolve(promise).then(resolve, reject);
      });
    });
  }
}

注意事项

  1. 兼容性
    上述实现是一个简化版本,未完全覆盖 Promise/A+ 规范的所有细节。生产环境应使用原生 Promise 或成熟的库(如 Bluebird)。

  2. 性能优化
    实际实现中需考虑更多边界条件和性能优化,例如微任务队列(queueMicrotask)替代 setTimeout

  3. 测试验证
    使用 Promise/A+ 测试套件(如 promises-aplus-tests)验证实现的合规性。

    promise js 实现

标签: promisejs
分享给朋友:

相关文章

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

vue promise 实现同步

vue promise 实现同步

Vue 中 Promise 实现同步的方法 在 Vue 中,Promise 本身是异步的,但可以通过一些方法模拟同步行为,或者让异步代码以更直观的方式执行。以下是几种常见方法: 使用 async/a…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…

js实现上传图片预览

js实现上传图片预览

使用FileReader实现图片预览 通过FileReader对象读取用户选择的图片文件,并将其显示在页面上。这种方法适用于现代浏览器。 // HTML部分 <input type="file…