实现Promise最终版

单纯记录一下

function Promise(fn) {
  var data = undefined, reason = undefined
  var succallbacks = []
  var failcallbacks = []
  var status = 'pending'
  this.then = function (fulfilled, rejected) {
    return new Promise(function (resolve, reject) {
      //返回一个新的promise
      function suc(value) {
      	//成功
      	var ret = (typeof fulfilled === 'function' && fulfilled(value)) || value
      	if (ret && typeof ret['then'] == 'function') {
        	//判断 then中的 返回的是否是promise对象,如果是注册then方法
        	ret.then(function (value) {
          	  resolve(value)
            })
          } else {
            resolve(ret)
          }
        }
        function errback(reason) {
          //失败
          reason = (typeof rejected === 'function' && rejected(reason)) || reason
          reject(reason)
        }

        if (status === 'pending') {
          succallbacks.push(suc)
          failcallbacks.push(errback)
        } else if (status === 'fulfilled') {
         suc(data)
        } else {
         errback(reason)
        }
      })
    }

	function resolve(value) {
      setTimeout(function () {
        //加入延时 因为then方法一定要在resolve之前
  	    status = 'fulfilled'
  		data = value
  		succallbacks.forEach((callback) => {
  		  callback(value)
	    })
      }, 0)
    }

  function reject(value) {
    setTimeout(function () {
      status = 'rejected'
      reason = value
      failcallbacks.forEach((callback) => {
        callback(value)
       })
    }, 0)
  }
  fn(resolve, reject)
}

let p = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(1)
  }, 1000)
})

p.then((data) => {
  console.log(data)
  return new Promise((resolve, reject) => {
    //then 方法返回的是一个promise对象,故执行 promise中的then注册该结果,在resolve
    setTimeout(() => {
      resolve(2)
    }, 1000)
  })
}).then((data) => {
   console.log(data)
})

来源于博客https://www.jianshu.com/p/327e38aec874

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值