Promise 介紹
一個 Promise
物件表示的操作已產生或將最終產生的值。Promises 提供了一種強大的方法來包裝非同步工作的(可能是待定的)結果,減輕了深層巢狀回撥的問題(稱為“ 回撥地獄 ”)。
國家和控制流程
承諾可以是以下三種狀態之一:
- 待定 - 基礎操作尚未完成,承諾尚未完成。
- 完成 -該操作已完成,並承諾被兌現了價值。這類似於從同步函式返回值。
- 拒絕在操作過程中發生了錯誤,並承諾是 - 拒絕與原因。這類似於在同步函式中丟擲錯誤。
當承諾被履行或拒絕時,據說承諾得到解決 (或解決 )。一旦承諾得到解決,它就會變成不可變的,它的狀態也不會改變。該 then
和 catch
承諾的方法可用於連線時,它是解決了執行回撥。這些回撥分別用履行值和拒絕原因呼叫。
例
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;
}
});
該 then
和 catch
方法可用於連線完成和拒絕回撥:
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 的狀態。