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