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


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

 

 


免責聲明!

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



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