關於Promise,你必須知道的幾點。

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對象

相關文章
相關標籤/搜索