• 手写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

  • 相关阅读:
    python输出shell命令执行结果
    python实验二:字符串排序
    python学习系列
    linux命令系列目录
    git初步
    HTML基础教程 七 高级
    HTML/CSS基础教程 六
    linux命令---sed
    linux命令---unzip
    模块
  • 原文地址:https://www.cnblogs.com/wuconghui/p/10980917.html
Copyright © 2020-2023  润新知