下面是一个简单的JavaScript Promise的实现代码:

// Promise构造函数
function Promise(fn) {
  var self = this;
  self.status = 'pending'; // Promise的状态,默认为pending
  self.value = undefined; // Promise的值,默认为undefined
  self.onResolvedCallback = []; // Promise resolve时的回调函数集合
  self.onRejectedCallback = []; // Promise reject时的回调函数集合

  function resolve(value) {
    if (self.status === 'pending') {
      self.status = 'resolved';
      self.value = value;
      // 依次执行所有的回调函数
      self.onResolvedCallback.forEach(function(callback) {
        callback(value);
      });
    }
  }

  function reject(reason) {
    if (self.status === 'pending') {
      self.status = 'rejected';
      self.value = reason;
      // 依次执行所有的回调函数
      self.onRejectedCallback.forEach(function(callback) {
        callback(reason);
      });
    }
  }

  // 执行传入的函数
  try {
    fn(resolve, reject);
  } catch (e) {
    reject(e);
  }
}

// then方法
Promise.prototype.then = function(onResolved, onRejected) {
  var self = this;
  var promise2;

  // 如果onResolved不是函数,则将其设为一个默认的函数
  onResolved = typeof onResolved === 'function' ? onResolved : function(value) { return value; };
  // 如果onRejected不是函数,则将其设为一个默认的函数
  onRejected = typeof onRejected === 'function' ? onRejected : function(reason) { throw reason; };

  if (self.status === 'resolved') {
    // 如果Promise的状态已经是resolved,则立即执行onResolved函数,并返回一个新的Promise对象
    return promise2 = new Promise(function(resolve, reject) {
      try {
        var x = onResolved(self.value);
        if (x instanceof Promise) {
          // 如果onResolved函数的返回值是一个Promise对象,则直接取其结果作为promise2的结果
          x.then(resolve, reject);
        } else {
          resolve(x);
        }
      } catch (e) {
        reject(e);
      }
    });
  }

  if (self.status === 'rejected') {
    // 如果Promise的状态已经是rejected,则立即执行onRejected函数,并返回一个新的Promise对象
    return promise2 = new Promise(function(resolve, reject) {
      try {
        var x = onRejected(self.value);
        if (x instanceof Promise) {
          // 如果onRejected函数的返回值是一个Promise对象,则直接取其结果作为promise2的结果
          x.then(resolve, reject);
        } else {
          resolve(x);
        }
      } catch (e) {
        reject(e);
      }
    });
  }

  if (self.status === 'pending') {
    // 如果Promise的状态是pending,则将onResolved和onRejected函数分别添加到onResolvedCallback和onRejectedCallback数组中
    return promise2 = new Promise(function(resolve, reject) {
      self.onResolvedCallback.push(function(value) {
        try {
          var x = onResolved(value);
          if (x instanceof Promise) {
            // 如果onResolved函数的返回值是一个Promise对象,则直接取其结果作为promise2的结果
            x.then(resolve, reject);
          } else {
            resolve(x);
          }
        } catch (e) {
          reject(e);
        }
      });

      self.onRejectedCallback.push(function(reason) {
        try {
          var x = onRejected(reason);
          if (x instanceof Promise) {
            // 如果onRejected函数的返回值是一个Promise对象,则直接取其结果作为promise2的结果
            x.then(resolve, reject);
          } else {
            resolve(x);
          }
        } catch (e) {
          reject(e);
        }
      });
    });
  }
};

// 测试代码
var p = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('Hello, World!');
  }, 1000);
});

p.then(function(value) {
  console.log(value); // 输出:Hello, World!
});

这是一个简单的Promise实现,包含了Promise构造函数和then方法。在构造函数中,我们定义了resolve和reject函数,并调用传入的函数。在then方法中,我们根据Promise的状态执行相应的回调函数,并返回一个新的Promise对象

请手写一个Javascript的Promise实现代码

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

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