zoukankan      html  css  js  c++  java
  • promise 学习笔记

    /**
    * https://juejin.im/post/597724c26fb9a06bb75260e8#heading-7 学习笔记
    * result是每个部分的result 放在一起的话 打印顺序是不同的
    */



    //----------------------promise的立即执行性-----------------------
    var p = new Promise(function(resolve,reject) {
     
    console.log("create a promise");
    resolve("success");
     
    })
    console.log(p)
    console.log("after new promise");

    p.then(function(value) {
    console.log(value)
    })

    /*result:create a promise
    after new promise
    success
    new promise的时候会立即执行,只是其中执行的可以是异步代码,当调用then时promise
    接收的参数才会执行
    在Promise的原型上有一个then方法,会在promise的executor(resolve或者reject)执行后根据不同情况执行
    */
    //---------------------promise三种状态-----------------------
    var p1= new Promise(function (resolve,reject) {
    resolve(1);
    })
    var p2 = new Promise(function (resolve,reject) {
    setTimeout(() => {
    resolve(2);
    }, 500);
    })
    var p3=new Promise(function (resolve,reject) {
    setTimeout(() => {
    reject(3);
    }, 500);
    })

    console.log(p1);
    console.log(p2);
    console.log(p3);

    setTimeout(() => {
    console.log(p2)
    }, 1000);
    setTimeout(() => {
    console.log(p3)
    }, 1000);

    p1.then(function (value) {
    console.log(value);
    })
    p2.then(function (value) {
    console.log(value)
    })
    p3.catch(function(error) {
    console.log(error)
    })

    /*
    result:Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 1}
    Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined} 我的执行value:2
    Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined} 我的执行value:3
    1
    2
    3
    Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 2}
    Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: 3}

    解析:
    promise有3种状态,刚刚创建完成时为pending,执行了resolve方法后由pending状态变为resolved状态,
    如果执行的是reject方法,则由pending状态变为rejected状态。
    new promise会立即执行里面的同步代码,所以p1的resolve被执行了,由pending状态
    变为resloved状态,p2,p3里面的是异步代码所以需要等主线程同步代码执行完成后
    再执行,因此状态仍为pending。
    执行完3个console.log之后执行微任务p1.then,p2.then,p3.then 输出1,2,3
    再执行宏任务settimeout p2,输出resloved 2
    无微任务可执行则开始执行宏任务settimeout p3,输出rejected 3

    */
    //------------------------promise状态的不可逆性----------------------------
    var p4 = new Promise(function (resolve,reject) {
    resolve("success1");
    resolve("success2")
    });
    var p5 = new Promise(function (resolve,reject) {
    resolve("success3");
    reject("reject")
    });
    p4.then(function (value) {
    console.log(value)
    })
    p5.then(function (value) {
    console.log(value)
    })
    /** result:success1
    * sucess3
    * 解析:promise的状态一旦由pending变为resolved或者rejected之后,promise的状态和值
    * 就固化下来了,无论你之后怎么调用resolve跟reject都不能改变它的状态和值
    */

    //--------------------promise的链式调用-------------------------------
    var p6= new Promise(function (resolve,reject) {
    resolve("successp6")
    })
    var newp = p6.then(function (value) {
    console.log(value)
    })
    console.log(newp)
    /*result:Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: undefined}
    promise的then方法返回一个新的promise对象,因此可以通过链式调用then方法,then方法
    接收2个函数作为参数,第一个参数是promise执行成功时的回调,第二个参数是promise执行
    失败时的回调,两个函数只有1个会被调用,函数的返回值将被用作创建then返回的promise对象
    这两个参数的返回值可以是以下三种情况中的一种:
    1.return一个同步值或者undefined(当没有返回值时,默认返回undefined),then方法将返回
    一个resolved状态的promise对象,其值为return的这个值
    2.return一个promise,then方法将根据这个promise的状态和值创建一个新的promise对象返回
    3.throw一个同步异常,then方法将返回一个rejected状态的promise,值是该异常
    */
    var p7 = new Promise(function (resolve,reject) {
    resolve(7)
    });
    p7.then(function(value){
    console.log(value);
    return value * 2;
    }).then(function (value) {
    console.log(value)
     
    }).then(function(value) {
    console.log(value);
    return Promise.resolve("resolved")
    }).then(function (value) {
    console.log(value);
    return Promise.reject("rejected")
    }).then(function (value) {
    console.log("resolve:"+value)
    },function (err) {
    console.log("rejected:"+err)
    })

    /*按照文章的结果一个得到
    7
    14
    undefined
    "resolve"
    "reject: rejected"
    然而我只有一个孤零零的7 ??????????????手动黑人问号 因为p7的resolve(7)写成了console.log(7) 手动敲打
    */
    /**
    * 解析:第一个then 打印出7 返回值为14 返回一个resolved状态值为14的promise对象
    * 第二个then 打印出14 返回值undefined 返回一个resolved状态的值为undefined的promise对象
    * 第三个then打印出undefined 返回值为一个新的promise 返回一个resolved状态值为resolved的promise对象
    * 第四个then打印出resolved 返回值为一个新的promise 返回一个rejected状态值为rejected的promise对象
    * 第五个then打印出rejected:rejected
    */

    //--------------------------promise then的回调异步性--------------------
    var p9 = new Promise(function (resolve,reject) {
    resolve(9)
    })
    p9.then(value=> {
    console.log(value)
    })
    console.log('这个应该是会比then先执行的')
    /**
    * result: 这个应该是会比then先执行的
    * 9
    * 解析:promise接收的函数参数是同步执行的,但是then方法中的回调函数的执行则是
    * 异步的,因此9会在这个应该是会比then先执行的 之后输出,根据event loop
    * 执行顺序既可得到这个结果
    */

    //--------------------------promise中的异常----------------------------------
    var p10 = new Promise(function (resolve,reject) {
    foo.bar();
    resolve(10)
    })
    p10.then(value =>{
    console.log("p10 then value:"+value)
    },err=> {
    console.log("p10 then errro:"+err)
    }).then(value =>{
    console.log("p10 then then value:"+value)
    },err=> {
    console.log("p10 then then errro:"+err)
    })

    var p11 = new Promise(function (resolve, reject) {

    resolve(11)
    })
    p11.then(value => {
    console.log("p11 then value:" + value)
    foo.bar();
    }, err => {
    console.log("p11 then errro:" + err)
    }).then(value => {
    console.log("p11 then then value:" + value)
    }, err => {
    console.log("p11 then then errro:" + err)
    return 12
    }).then(value => {
    console.log("p11 then then then value:" + value)
    }, err => {
    console.log("p11 then then then errro:" + err)
    return 12
    })


    /**
    * p10 then error:foo.bar() is undefined
    * p11 then value:11
    * p10 then then value:undefined
    * p11 then then error:foo.bao() is undefined
    * p11 then then then value:12
    *
    * 解析:promise中的异常由then中的第二个参数处理,异常信息将作为promise的值,一旦异常得到处理,后续
    * promise对象将恢复正常,并会被promise执行成功回调的函数处理
    * ps:因为then回调的异步性,所以p10 跟p11的then交替执行
    */


    //------------------------promise.resolve()------------------------------------
    var p12 = Promise.resolve(1);
    var p13 = Promise.resolve(p12);
    var p14 = new Promise(function (resolve,reject) {
    resolve(1)
    });
    var p15 = new Promise(function (resolve,reject) {
    resolve(p12)
    });

    console.log("p12===p13:",p12===p13);
    console.log("p12===p14:", p12 === p14);
    console.log("p12===p15:", p12 === p15);
    console.log("p14===p15:", p14 === p15);
    p15.then(function (value) {
    console.log("p15=",value)
    })
    p14.then(function (value) {
    console.log("p14=", value)
    })
    p13.then(function (value) {
    console.log("p13=", value)
    })
    /**
    * result:
    * p12===p13:true
    * p12===p14:false
    * p12===p15:false
    * p14===p15:false
    * p14=1
    * p13=1
    * p15=1
    * 解析:promise.resolve(...)可以接收一个值或者promise对象作为参数,当为一个数值的时候,返回一个resolved状态值为这个数值
    * 的promise对象,当参数位promise对象时,返回这个promise对象,因此p12===p13,但是通过new的方式创建的promise就是一个
    * 新的promise对象了,所以后面都为false,虽然p15的then最先调用但是却最后打印,是因为p15的resolve中接收的是一个p12的
    * promise对象,需要对p12进行“拆箱”,获取p12的状态和值,这个操作是异步的
    */

    //-------------------------resolve vs reject------------------------
    var p16 = new Promise(function (resolve,reject) {
    resolve(Promise.resolve("resolve"))
    });
    var p17 = new Promise(function (resolve,reject) {
    resolve(Promise.reject("reject"))
    });
    var p18 = new Promise(function (resolve,reject) {
    reject(Promise.resolve("resolve"));
    })

    p16.then(value=>{
    console.log("fulfilled:",value)
    },err=>{
    console.log("rejected:",err)
    })
    p17.then(value => {
    console.log("fulfilled:", value)
    }, err => {
    console.log("rejected:", err)
    })
    p18.then(value => {
    console.log("fulfilled:", value)
    }, err => {
    console.log("rejected:", err)
    })
    /**
    * result:rejected:一个状态位resolve的promise对象
    * fulfilled:resolve
    * rejected:reject
    * 解析:promise回调函数中的第一个参数resolve会对promise进行“拆箱”操作,即当resolve的参数是一个promise对象时,resolve会
    * 拆箱获取这个promise的状态和值,但是这个过程是异步的。p16拆箱完成后获得promise对象状态为resolved,执行fulfilled,
    * p17拆箱完成后获得promise对象的状态为rejected,进行rejected.
    * promise回调函数的第二个参数reject不具备拆箱功能,reject的参数会直接传递给then方法的rejected回调,因此即使
    * p18接收的是一个resolved状态的promise,也会执行then里面的rejected函数,参数就是这个resolved状态的promise
    */


    //----------------------------------promise.all promise.race--------------
    var p19 = new Promise(function (resolve,reject) {
    setTimeout(()=>{
    resolve({a:1})
    })
    })
    var p20 = new Promise(function (resolve, reject) {
    setTimeout(() => {
    resolve({ b: 2 })
    })
    })
    var p21 = new Promise(function (resolve, reject) {
    setTimeout(() => {
    resolve({ c: 3 })
    })
    })
    Promise.all([p19,p20,p21]).then((data)=> {
    console.log("data:",data)
    },(err) =>{
    console.log("rejected:",err)
    })
    Promise.race([p19, p20, p21]).then((data) => {
    console.log("data:", data)
    }, (err) => {
    console.log("rejected:", err)
    })
    /**
    * result: 全为resolve:data:[{a:1},{ b: 2 },{ c: 3 }]
    * 解析:promise all是所有的promise resolve后再执行then的成功回调,如果有一个promise失败则直接走到then的失败回调
    * p20为reject 则执行结果为rejected:{b:2}
    *
    * race的结果:data:{a:1}
    * 解析:promise race是有一个promise resolve了就执行then的成功回调,如果第一个promise就失败了则直接走到then的失败回调
    */
    每天进步一点点
  • 相关阅读:
    react常用的方法
    react手动搭建
    js基础
    原生JavaScript实例之简单放大镜
    ||与&&的返回值
    promise简单小结
    连接服务器一般步骤
    github小总结
    __proto__指向问题
    一些函数返回值
  • 原文地址:https://www.cnblogs.com/miraclesakura/p/10109219.html
Copyright © 2011-2022 走看看