本機承諾
Version >= V6.0.0
Promise 是非同步程式設計的工具。在 JavaScript 中,承諾以其 then
方法而聞名。承諾有兩個主要狀態’待定’和’已結算’。一旦承諾已經解決,它就無法回到待定狀態。這意味著承諾主要適用於僅發生一次的事件。 settled
狀態有兩個狀態: resolved
和 rejected
。你可以使用 new
關鍵字建立新的承諾,並將函式傳遞給建構函式 new Promise(function (resolve, reject) {})
。
傳遞給 Promise 建構函式的函式總是接收通常分別名為 resolve
和 reject
的第一個和第二個引數。這兩個引數的命名是慣例,但它們會將承諾置於已解決狀態或已拒絕狀態。當其中任何一個被稱為承諾時,承諾從待定變為已結算。當執行所需的動作(通常是非同步的)並且如果動作有錯誤時使用 reject
,則呼叫 resolve
。
在下面,timeout 是一個返回 Promise 的函式。
function timeout (ms) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve("It was resolved!");
}, ms)
});
}
timeout(1000).then(function (dataFromPromise) {
// logs "It was resolved!"
console.log(dataFromPromise);
})
console.log("waiting...");
控制檯輸出
waiting...
// << pauses for one second>>
It was resolved!
呼叫超時時,傳遞給 Promise 建構函式的函式將立即執行。然後執行 setTimeout 方法,並將其回撥設定為在下一個 ms
毫秒內觸發,在本例中為 ms=1000
。由於未觸發對 setTimeout 的回撥,因此超時函式將控制權返回給呼叫範圍。然後儲存 then
方法鏈,以便在/如果 Promise 已解決時稍後呼叫。如果這裡有 catch
方法,它們也會被儲存,但是當/如果承諾’拒絕’時會被觸發。
然後指令碼列印’等待……’。一秒鐘之後,setTimeout 呼叫它的回撥,該回撥使用字串“It was resolved!”呼叫 resolve 函式。然後將該字串傳遞給 then
方法的回撥,然後記錄給使用者。
在同樣的意義上,你可以包裝非同步 setTimeout 函式,該函式需要回撥,你可以使用 promise 包裝任何單個非同步操作。
閱讀 JavaScript 文件 Promises 中有關 promises 的更多資訊。