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的失败回调
    */
    每天进步一点点
  • 相关阅读:
    Jzoj4822 完美标号
    Jzoj4822 完美标号
    Jzoj4792 整除
    Jzoj4792 整除
    Educational Codeforces Round 79 A. New Year Garland
    Good Bye 2019 C. Make Good
    ?Good Bye 2019 B. Interesting Subarray
    Good Bye 2019 A. Card Game
    力扣算法题—088扰乱字符串【二叉树】
    力扣算法题—086分隔链表
  • 原文地址:https://www.cnblogs.com/miraclesakura/p/10109219.html
Copyright © 2011-2022 走看看