function MyPromise(executor) { let self = this; self.status = 'pending'; // Promise 当前的状态 self.value = undefined; // Promise 的值 self.reason = undefined; // Promise 被拒绝的原因 self.onResolvedCallbacks = []; // Promise resolve 时的回调函数集合 self.onRejectedCallbacks = []; // Promise reject 时的回调函数集合

function resolve(value) { if (self.status === 'pending') { self.status = 'fulfilled'; self.value = value; self.onResolvedCallbacks.forEach(fn => fn()); } }

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

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

MyPromise.prototype.then = function(onFulfilled, onRejected) { onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : value => value; onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason }; let self = this; let promise2 = new MyPromise((resolve, reject) => { if (self.status === 'fulfilled') { setTimeout(() => { try { let x = onFulfilled(self.value); resolvePromise(promise2, x, resolve, reject); } catch (e) { reject(e); } }, 0); }

if (self.status === 'rejected') {
  setTimeout(() => {
    try {
      let x = onRejected(self.reason);
      resolvePromise(promise2, x, resolve, reject);
    } catch (e) {
      reject(e);
    }
  }, 0);
}

if (self.status === 'pending') {
  self.onResolvedCallbacks.push(() => {
    setTimeout(() => {
      try {
        let x = onFulfilled(self.value);
        resolvePromise(promise2, x, resolve, reject);
      } catch (e) {
        reject(e);
      }
    }, 0);
  });
  self.onRejectedCallbacks.push(() => {
    setTimeout(() => {
      try {
        let x = onRejected(self.reason);
        resolvePromise(promise2, x, resolve, reject);
      } catch (e) {
        reject(e);
      }
    }, 0);
  });
}

}); return promise2; }

function resolvePromise(promise2, x, resolve, reject) { if (promise2 === x) { return reject(new TypeError('Chaining cycle detected for promise')); } let called = false; if (x instanceof MyPromise) { x.then(value => { if (called) return; called = true; resolvePromise(promise2, value, resolve, reject); }, reason => { if (called) return; called = true; reject(reason); }); } else if (x !== null && (typeof x === 'object' || typeof x === 'function')) { try { let then = x.then; if (typeof then === 'function') { then.call(x, value => { if (called) return; called = true; resolvePromise(promise2, value, resolve, reject); }, reason => { if (called) return; called = true; reject(reason); }); } else { resolve(x); } } catch (e) { if (called) return; called = true; reject(e); } } else { resolve(x); } }

MyPromise.prototype.catch = function(onRejected) { return this.then(null, onRejected); }

MyPromise.all = function(promises) { return new MyPromise((resolve, reject) => { let results = []; let count = 0; for (let i = 0; i < promises.length; i++) { promises[i].then(value => { results[i] = value; count++; if (count === promises.length) { resolve(results); } }, reject); } }); }

MyPromise.race = function(promises) { return new MyPromise((resolve, reject) => { for (let i = 0; i < promises.length; i++) { promises[i].then(resolve, reject); } }); }

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

MyPromise.reject = function(reason) { return new MyPromise((resolve, reject) => { reject(reason); }); }

手写一个 Promise 实现 - 深入理解 JavaScript 异步编程

原文地址: https://www.cveoy.top/t/topic/msSv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录