1.如何改變promise的狀態promise
1). resolve(value) 若是當前的狀態是pedding 就會改成 resolved異步
2). reject(reason) 若是當前狀態是pedding 就會改成 rejected函數
2.一個promise指定多個成功 / 失敗的回調,都會調用嗎?spa
當promise狀態改變時,對應的回調函數都會調用code
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). 都有可能,正常狀況下時先指定回調函數再改變狀態,但也能夠先改變狀態,再指定回調。blog
2). 如何先改變狀態,再指定回調函數回調函數
在執行器中直接調用resolve() / reject()同步
再延遲更長的時間才調用thenconsole
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對象