• Promise.resolve()与Promise



    //Promise.resolve()和Promise.reject()常用来生成已经被决议为失败或者成功的promise案例
    //Promise.reject()简单一些,不管传给它什么值,它决议为失败后就会直接把这个值传递过来

    一、Promise.resolve
    1.传递一个普通的值(比如字符串,数字等等)

                let p1 = new Promise(resolve => {
                    resolve('成功');
                })
                //和上面是等价的
                let p2 = Promise.resolve('成功');  //会直接决议为成功并把这个值传递过去
                

    2.传递一个promise实例

                let cn = new Promise( resolve =>{
                    resolve('耶')
                })
                //直接返回传递进去的promise
                let p = Promise.resolve(cn);  //这里直接将cn实例返回给了p
                p.then(data => void console.log(data))  //后打印结果为耶
                console.log( p === cn)  //先打印true
                

    3、

    传递一个thenable对象(和类数组的概念有些相似)
    //鸭子类型:一只鸡如果看起来像鸭子,那么它就是鸭子。在鸭子类型中,关注的不是对象的类型本身,而是他如何使用的。
    //具有then方法的对象,看着像promise,那就把它转成promise,保留then

    let  obj = {  //obj就是一个thenable对象
                    then(cb){
                        console.log('我被执行了');  //先打印'我被 执行了'
                        cb('哼')  
                    },
                    oth(){
                        console.log('我被抛弃了')  //不打印
                    }
                }
                //立即执行then方法
                Promise.resolve(obj).then(data => {
                    console.log(data)  //打印出'哼'
                })
                //总结:传进thenable对象时,会立即执行then方法,如果then方法中有回调,也会在thenable对象中被调用
                
                

    二、Promise.reject

    Promise.reject({ then() { console.log(1) } })
                    .then( () =>{
                        console.log('我不会被执行')
                    }, e => {
                        console.log(e)  //不管在reject()中传递什么值,在这里拿到的就是什么值
                    })
                

    三、

    Promise在决议之后是异步去做他接下来要去做的事情
    //打印结果按顺序为 123465

    console.log(1);
                
                let pp = new Promise(resolve => {
                    console.log(2);
                    resolve();
                    console.log(3);
                })
                
                console.log(4);
                
                p.then( () =>{
                    console.log(5);  //异步是最后执行的
                })
                
                console.log(6)
                //总结:一般情况下,在当前这一轮的事件循环中,异步任务肯定是在同步任务之后执行的
                

    四、把同步的任务转成异步任务

                function createAsyncTask(syncTask){
                    return Promise.resolve(syncTask).then(syncTask => syncTask())
                }
                
                createAsyncTask( () =>{
                    console.log('我变成了异步任务')  //第二输出
                    return 1+1
                }).then(res => {
                    console.log(res);  //最后输出
                })
                
                console.log('我是同步任务')   //最先输出
  • 相关阅读:
    【2021-03-31】人生十三信条
    【2021-03-30】证明自己是人类忠实的朋友
    【2021-03-29】万物本是无序
    缀点成线
    1比特与2比特字符
    Solution -「LOCAL」「cov. 牛客多校 2020 第三场 I」礼物
    Solution -「HNOI 2007」「洛谷 P3185」分裂游戏
    Solution -「CF 1372E」Omkar and Last Floor
    Solution -「POJ 3710」Christmas Game
    Solution -「CF 1380F」Strange Addition
  • 原文地址:https://www.cnblogs.com/rickdiculous/p/13616827.html
Copyright © 2020-2023  润新知