1.如何改變promise的狀態
1). resolve(value) 如果當前的狀態是pedding 就會改為 resolved
2). reject(reason) 如果當前狀態是pedding 就會改為 rejected
2.一個promise指定多個成功 / 失敗的回調,都會調用嗎?
當promise狀態改變時,對應的回調函數都會調用
const p = new Promise((resolve,reject)=>{ resolve(1) }) p.then( value=>{ console.log(value) // 1 }, reason=>{ console.log(reason) } ) p.then( value=>{ console.log('value2:' + value) // value2:1 }, reason=>{ console.log('reason2' + reason) } )
3.改變promise的狀態和指定回調函數,誰先誰后?
1). 都有可能,正常情況下時先指定回調函數再改變狀態,但也可以先改變狀態,再指定回調。
2). 如何先改變狀態,再指定回調函數
在執行器中直接調用resolve() / reject()
再延遲更長的時間才調用then
3). 什么時候才能得到數據
如果先指定回調函數,當狀態改變的時候,回調函數就會被執行,得到數據
如果先改變狀態,那當指定回調時,就會調用回調函數,得到數據
4. promise.then()返回的新的promise的狀態由誰決定?
1). 簡單表達:由then()指定的回調函數的執行結果來決定
2). 詳細表達:
如果回調函數拋出異常,新的promise變為reject,reason為異常的原因
如果返回的為非promise的任意值,則狀態為resolved value為其返回值
如果返回的為一個新的promise,狀態為新的promise的結果
5. promise如何串聯多個異步操作任務?
1). promise的then()返回一個新的promise,可以寫成then(). 的鏈式調用
2). 通過then 的鏈式調用串聯多個 同步/異步 任務
說明:如果想在then()中執行異步任務,必須返回一個新的promise不能直接調用 resolve / reject
new Promise((resolve, reject)=>{ console.log("執行任務1(同步)") setTimeout(()=>{ console.log("執行任務2(異步)") resolve(2) },1000) }).then( value =>{ console.log("任務2的結果"); console.log("執行任務3(同步)"); return 3 } ).then( value=>{ console.log("接受任務3的結果") return new Promise((resolve,reject)=>{ setTimeout(()=>{ console.log("執行任務4(異步)") resolve(4) }) }) } ).then( value=>{ console.log("接收任務4的結果") } )
6. promise 異常傳透
1). 當使用promise的then鏈式調用的時候,可以到最后再指定失敗的回調函數
2). 前面的任意操作出現了異常,都會傳到最后的失敗的回調中處理
new Promise((resolve,reject)=>{ reject(2) }).then( value=>{}, // reason=>{throw reason} ).then( value=>{}, // reason=>{throw reason} ).catch( reason=>{ console.log(reason) return new Promise(()=>{}) // 返回一個pending狀態的promise ,后面的鏈式調用就不會繼續執行 } ).then( // 這里面將不會繼續執行 value=>{ }, reason=>{ } ) // 上面的任意一個promise發生錯誤,都會一層一層的傳遞到最后一個錯誤的回調中來處理 // 如果then()中不傳遞回調函數,就會默認傳遞 reason => {throw reason} ,將錯誤往下拋出
7. 如何中斷Promise鏈?
在回調函數中返回一個pedding狀態的promise對象