9.9 promise实现 写完了传到gitee上面了,这里这个不完整

//promise:then,catch,finally,all,race

// then时state还是pending等待状态 我们就需要在then调用的时候,将成功和失败存到各自的数组,一旦reject或者resolve,就调用它们,类似发布订阅

//pending,fulfilled,rejected
const pedding = 'pedding'
const fulfilled = 'fulfilled'
const rejected = 'rejected'
class Promise {
  constructor(executor) {
    console.log('executor:'+ executor)
   this.status = pedding //初始状态
   this.value = undefined //成功或者失败的值
   this.fail = undefined
   this.successCallback = [] //成功或者失败的回调函数
   this.errorCallback = []
   let resolve = (value) => { //成功之后就依次执行
   setTimeout(() => {
    if (this.status === pedding) {//只有在状态是pending的时候才能改变
      //console.log('resolve:'+value)
       this.status = fulfilled
       this.value = value
       this.successCallback.forEach(fn => {
         fn()
       })
     }  
   }, 0);
   };
   let reject = (fail) => {
     setTimeout(() => {
      if (this.status === pedding) {
      //  console.log('reject:'+ fail)
        this.status = rejected
        this.fail = fail
        this.errorCallback.forEach(fn => {
          fn()
        })
       }
     }, 0);
   };
   try {
    executor(resolve,reject)
   }catch(err){
    reject(err)
   }
      
  }
    then(success,error) {
    if(this.status === fulfilled) {
     return new Promise((resolve,reject) => {
      try{
        let fun = success(this.value)
        if(fun instanceof Promise) {
          fun.then(resolve,reject)
        }else{
          resolve(fun)
        }
      }catch(err) {
          reject(err)
      }
     })
    }
    if(this.status === rejected) {
      return new Promise((resolve, reject) => {
	      try {
	        let j = error(this.fail)
	        if (j instanceof Promise) {
	          j.then(resolve, reject)
	        } else {
	          resolve(j)
	        }
	      } catch (err) {
	        reject(err)
	      }
	    })
    }
    // console.log(this.reject)
    // 订阅成功失败
    if(this.status === pedding) {//刚进来必须是pedding状态,否则状态一旦变了回调还没有注册
      return new Promise((resolve, reject) => {
        this.successCallback.push(() => {
          let f = success(this.value)
	        if (f instanceof Promise) {
	          f.then(resolve, reject)
	        } else {
	          resolve(f)
	        }
        })
        this.errorCallback.push(() =>{
         
          let j = error(this.fail)
          if (j instanceof Promise) {
            j.then(resolve, reject)
          } else {
            resolve(j)
          }
        })
      })
     
    }
   }
  
}
let  p = new  Promise((resolve,reject) =>{
   //reject('失败')
   resolve('成功1')
})

 p.then((res) => {
   console.log('then的第一个参数成功'+res)
   return new  Promise((resolve,reject) =>{
    //reject('失败')
    resolve('成功2')
 })
 },()=>{
console.log('失败')
 }).then((res) => {
  console.log('then的第二个参数成功'+res)
},()=>{
console.log('失败2')
})
// .then((res) => {
//   console.log('then的第3个参数成功'+res)
// },()=>{
// console.log('失败3')
// })
// p.then()
//直接在then后面then 报错Cannot read property 'then' of undefined,所以需要返回一个新的promise对象

  

输出

executor:(resolve,reject) =>{
   //reject('失败')
   resolve('成功1')
}
executor:(resolve, reject) => {
        this.successCallback.push(() => {
          let f = success(this.value)
	        if (f instanceof Promise) {
	          f.then(resolve, reject)
	        } else {
	          resolve(f)
	        }
        })
        this.errorCallback.push(() =>{
         
          let j = error(this.fail)
          if (j instanceof Promise) {
            j.then(resolve, reject)
          } else {
            resolve(j)
          }
        })
      }
executor:(resolve, reject) => {
        this.successCallback.push(() => {
          let f = success(this.value)
	        if (f instanceof Promise) {
	          f.then(resolve, reject)
	        } else {
	          resolve(f)
	        }
        })
        this.errorCallback.push(() =>{
         
          let j = error(this.fail)
          if (j instanceof Promise) {
            j.then(resolve, reject)
          } else {
            resolve(j)
          }
        })
      }
then的第一个参数成功成功1
executor:(resolve,reject) =>{
    //reject('失败')
    resolve('成功2')
 }
executor:(resolve, reject) => {
        this.successCallback.push(() => {
          let f = success(this.value)
	        if (f instanceof Promise) {
	          f.then(resolve, reject)
	        } else {
	          resolve(f)
	        }
        })
        this.errorCallback.push(() =>{
         
          let j = error(this.fail)
          if (j instanceof Promise) {
            j.then(resolve, reject)
          } else {
            resolve(j)
          }
        })
      }
then的第二个参数成功成功2

[Done] exited with code=0 in 0.095 seconds

  

posted @ 2020-09-09 16:20  尽世间恶丑  阅读(189)  评论(0编辑  收藏  举报