zoukankan      html  css  js  c++  java
  • Promise实现

    Promise实现:最难的部分感觉是不同实现的Promise之间的交互,代码看不懂,暂时不加那部分的代码
    function Promise (executor){
      var self = this
      self.status = 'pending'
      self.data = null
      self.onResolvedCallBack = []
      self.onRejectedCallBack = []
      function reslove(value){
        if(self.status === 'pending'){
          self.status = 'fulfilled'
          self.data = value
          self.onResolvedCallBack.forEach(cb => cb(value))
        }
      }
      function reject(reason){
        if(self.status === 'pending'){
          self.status = 'rejected'
          self.data = reason
          self.onRejectedCallBack.forEach(cb => cb(reason))
        }
      }
      try{
        executor(reslove,reject)
      }catch(e){
        reject(e)
      }
    }
    
    Promise.prototype.then = (onResolved,onRejected) => {
      let self = this
      let promise2
      onResolved = typeof onResolved === 'function' ? onResolved : value => { return value }
      onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason }
      if(self.status === 'fulfilled'){
        return promise2 = new Promise((reslove,reject) => {
          try{
            var x = onResolved(self.data)
            if(x instanceof Promise){
              x.then(reslove,reject)
            }else{
              reslove(x)
            }
          }catch(e){
            reject(e)
          }
        })
      }
      if(self.status === 'rejected'){
        return promise2 = new Promise((reslove,reject) => {
          try{
            var x = onRejected(self.data)
            if(x instanceof Promise){
              x.then(reslove,reject)
            }else{
              reslove(x)
            }
          }catch(e){
            reject(e)
          }
        })
      }
      if(self.status === 'pending'){
        return promise2 = new Promise((reslove,reject) => {
          self.onResolvedCallBack.push(function(value){
            try{
              var x = onResolved(value)
              if(x instanceof Promise){
                x.then(reslove,reject)
              }else{
                reslove(x)
              }
            }catch(e){
              reject(e)
            }
          })
          self.onRejectedCallBack.push(reason => {
            try{
              var x = onRejected(reason)
              if(x instanceof Promise){
                x.then(reslove,reject)
              }else{
                reslove(x)
              }
            }catch(e){
              reject(e)
            }
          })
        })
      }
    }
    
    Promise.prototype.catch = onRejected => {
      return this.then(null,onRejected)
    }
    
    /**
    * 不同之间的Promise之间交互目前实在是看不太懂,暂时不加上那部分代码
    */
    Promise.resolve = value => {
      return new Promise((resolve,reject) => {resolve(value)})
    }
    
    Promise.reject = reason => {
      return new Promise((reslove,reject) => {reject(reason)})
    }
    
    Promise.all = promises => {
      return new Promise((reslove,reject) => {
        let values = []
        let count = 0
        promises.forEach((promise,index,promises)=>{
          promise.then(value=>{
            values[index] = value
            count++
            if(count === promises.length){
              resolve(values)
            }
          },reject)
        })
      })
    }
    
    Promise.race = promises => {
      return new Promise((reslove,reject)=>{
        promises.forEach(promise=>{
          promise.then(reslove,reject)
        })
      })
    }
    
    Promise.allSettled = promises => {
        return new Promise((resolve) => {
            let values = []
            let count = 0
            promises.forEach((promise,index,promises)=>{
                promise.then(value=>{
                    values[index] = value
               }).catch((error)=>{
                    values[index] = error
                }).finally(()=>{
                    ++count
                    if(count == promises.length){
                        resolve(values)
                    }
                })
            })
        })
    }
    
    Promise.any = promises => {
        return new Promise((resolve,reject) => {
            let count = 0
            let arr = []
            promises.forEach(promise => {
                promise.then(res => {
                    resolve(res)
                }).catch(err => {
                    ++count
                    arr.push(err)
                    if(count == promises.length){
                        reject(arr)
                    }
                })
            })
        })
    }
    

      

       

  • 相关阅读:
    数据结构2
    EF Fluent API
    VS2017+mysql5.7 连接数据库生成实体
    JavaScript中的枚举
    EasyUI datagird 排序 按数字类型的问题
    php 将秒数转换为时间(年、天、小时、分、秒)
    mySQL把秒转换成日期
    Android 界面间传参数
    android 登陆界面
    Android 在已有的项目上创建新的项目
  • 原文地址:https://www.cnblogs.com/zhenjianyu/p/12965051.html
Copyright © 2011-2022 走看看