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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM