zoukankan      html  css  js  c++  java
  • 手写promise进阶版本

    promise/A+规范:

      术语:

      1、promise是一个对象或者函数,该对象或者函数有一个then方法

      2、thenable是一个函数或者对象,用来定义then方法

      3、value是promise成功时的状态值

      4、reason是promise失败时的状态值

        

      要求:一、二

    一、

      1、三种状态 :pending | fulfilled(resolved) | rejected 

      2、rejected当处于pending状态的时候,可以转移到fulfilled(resolved)或者rejected状态 

      3、当处于fulfilled(resolved)状态或者rejected状态的时候,就不可变。  

    二、

      1、一个promise必须有一个then方法,then方法接受两个参数并且必须返回一个promise

      

    // onFulfilled 用来接收promise成功的值
    // onRejected 用来接收promise失败的原因
    promise1=promise.then(onFulfilled, onRejected);

    三、

      简单的写一下promise的基本用法:

      

    var promise = new Promise((resolve,reject)=>{
    let a =1;b=2   
    if(a<b){
    resolve(a)
    } else{
    reject(b)
    }
    })
    promise.then(function(value){
    console.log(value)    
    },function(error){
    console.log(error)    
    })

      接着来实现promise的过程,不多说直接贴代码

    function myPromise(constructor){
        let self=this;
        self.status="pending" //定义状态改变前的初始状态
        self.value=undefined;//定义状态为resolved的时候的状态
        self.reason=undefined;//定义状态为rejected的时候的状态
        function resolve(value){
            //两个==="pending",保证了状态的改变是不可逆的
           if(self.status==="pending"){
              self.value=value;
              self.status="resolved";
           }
        }
        function reject(reason){
            //两个==="pending",保证了状态的改变是不可逆的
           if(self.status==="pending"){
              self.reason=reason;
              self.status="rejected";
           }
        }
        //捕获构造异常
        try{
           constructor(resolve,reject);
        }catch(e){
           reject(e);
        }
    }

      同时,需要在myPromise的原型上定义链式调用的then方法:

    myPromise.prototype.then=function(onFullfilled,onRejected){
       let self=this;
       switch(self.status){
          case "resolved":
            onFullfilled(self.value);
            break;
          case "rejected":
            onRejected(self.reason);
            break;
          default:       
       }
    }

      那么我们来测试一下结果:

      

    var p=new myPromise(function(resolve,reject){resolve(1)});
    p.then(function(x){console.log(x)})
    //输出1

     今天就写个进阶版的promise 喜欢更高难度的可以参考链接让我们共同进步吧

      

      引荐链接 :实现一个完美符合Promise/A+规范的Promise

  • 相关阅读:
    openwrt 相关文章
    负载均衡相关文章
    Today's Progress
    Rodrigues formula is beautiful, but uneven to sine and cosine. (zz Berkeley's Page)
    Camera Calibration in detail
    Fundamental Matrix in Epipolar
    Camera Calibration's fx and fy do Cares in SLAM
    FilterEngine::apply
    FilterEngine 类解析——OpenCV图像滤波核心引擎(zz)
    gaussBlur
  • 原文地址:https://www.cnblogs.com/wuconghui/p/10980917.html
Copyright © 2011-2022 走看看