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('我是同步任务')   //最先输出

 

posted @ 2020-09-05 00:31  是桂  阅读(1728)  评论(0编辑  收藏  举报