JavaScript 介紹

Promise對象表示已生成或最終生成值的操作。 Promises提供了一種強大的方法來包裝異步工作的(可能是待定的)結果,減輕了深層嵌套回調的問題(稱為“ 回調地獄 ”)。

國家和控制流程

承諾可以是以下三種狀態之一:

  • 待定 - 基礎操作尚未完成,承諾尚未完成。
  • 完成 -該操作已完成,並承諾滿足一個 。這類似於從同步函數返回值。
  • 被拒絕 - 操作期間發生錯誤,並且有理由 拒絕承諾。這類似於在同步函數中拋出錯誤。

當承諾被履行或拒絕時,據說承諾得到解決 (或解決 )。一旦承諾得到解決,它就會變成不可變的,它的狀態也不會改變。 promise的thencatch方法可用於附加在結算時執行的回調。這些回調分別用履行值和拒絕原因調用。

承諾流程圖

const promise = new Promise((resolve, reject) => {
    // Perform some work (possibly asynchronous)
    // ...

    if (/* Work has successfully finished and produced "value" */) {
        resolve(value);
    } else {
        // Something went wrong because of "reason"
        // The reason is traditionally an Error object, although
        // this is not required or enforced.
        let reason = new Error(message);
        reject(reason);

        // Throwing an error also rejects the promise.
        throw reason;
    }
});

thencatch方法可用於附加履行和拒絕回調:

promise.then(value => {
    // Work has completed successfully,
    // promise has been fulfilled with "value"
}).catch(reason => {
    // Something went wrong,
    // promise has been rejected with "reason"
});

注意:在執行promise或者其中一個回調時,如果發生錯誤,在同一個promise上調用promise.then(...)promise.catch(...)可能會導致Uncaught exception in Promise中出現Uncaught exception in Promise ,所以首選的辦法是附上由前返回的承諾下一個監聽器then / catch

可替代地,這兩個回調可以在到單個呼叫被連接then

promise.then(onFulfilled, onRejected);

將回調附加到已經解決的承諾將立即將它們放入微任務隊列中 ,並且將“盡快”(即緊接在當前執行的腳本之後)調用它們。與許多其他事件發射實現不同,在附加回調之前沒有必要檢查promise的狀態。


現場演示