promise

by Paco86

JavaScript

const PENDING = 'pending';
const RESOLVED = 'resolved';
const REJECTED = 'rejected';

const MyPromise= function (fn) {
	// 保存初始化状态
  const self = this;
	// 初始化状态
  self.state = PENDING;
  
  // 用于保存 resolve 或者 rejected 传入的值
  self.value = null;
  self.error = null;
  
	// 异步任务: 用于保存 resolve 的回调函数
  self.resolvedCallbacks = [];

  // 异步任务: 用于保存 reject 的回调函数
  self.rejectedCallbacks = [];
  
	function resolve(value) {
  	if (self.state === PENDING) {
    	self.state = RESOLVED;
      self.value = value;
      // 执行回调函数
    	self.resolvedCallbacks.forEach(callback => callback(value));
    }
  }
  
  function reject(error) {
  	if (self.state === PENDING) {
    	self.state = REJECTED;
      self.error = error;
      // 执行回调函数
    	self.rejectedCallbacks.forEach(callback => callback(error));
    }
  }
  
  try {
  	fn(resolve, reject);
  } catch (e) {
  	reject(e);
  }
};

MyPromise.prototype.then = function (onResolvedFn, onRejectedFn) {
  if (this.state === PENDING) {
    this.resolvedCallbacks.push(onResolvedFn);
    this.rejectedCallbacks.push(onRejectedFn);
  }
  
  if (this.state === RESOLVED) {
    onResolvedFn(this.value);
  }

  if (this.state === REJECTED) {
    onRejectedFn(this.error);
  }
};


// test
const p1 = new MyPromise((resolve, reject) => {
  setTimeout(() => {
    resolve('success');
  }, 2000);
});

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


p1.then((res)=>{
    console.log(res);
  }, (error)=>{
    console.log(error)
  }
);

p2.then((res)=>{
    console.log(res);
  }, (error)=>{
    console.log(error)
  }
);