Promise 介紹

一個 Promise 物件表示的操作已產生或將最終產生的值。Promises 提供了一種強大的方法來包裝非同步工作的(可能是待定的)結果,減輕了深層巢狀回撥的問題(稱為“ 回撥地獄 ”)。

國家和控制流程

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

  • 待定 - 基礎操作尚未完成,承諾尚未完成。
  • 完成 -該操作已完成,並承諾被兌現價值。這類似於從同步函式返回值。
  • 拒絕在操作過程中發生了錯誤,並承諾是 - 拒絕原因。這類似於在同步函式中丟擲錯誤。

當承諾被履行或拒絕時,據說承諾得到解決 (或解決 )。一旦承諾得到解決,它就會變成不可變的,它的狀態也不會改變。該 thencatch 承諾的方法可用於連線時,它是解決了執行回撥。這些回撥分別用履行值和拒絕原因呼叫。

StackOverflow 文件

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.then(...)promise.catch(...) 可能會在發生錯誤時導致 Uncaught exception in Promise,無論是在執行 promise 還是在其中一個回撥中,因此首選的方法是將下一個偵聽器附加到前一個返回的 promise 上 then / catch

或者,兩個回撥都可以通過一次呼叫附加到 then

promise.then(onFulfilled, onRejected);

將回撥附加到已經解決的承諾將立即將它們放入微任務佇列中 ,並且將儘快(即緊接在當前執行的指令碼之後)呼叫它們。與許多其他事件發射實現不同,在附加回撥之前沒有必要檢查 promise 的狀態。

現場演示