本機承諾

Version >= V6.0.0

Promise 是非同步程式設計的工具。在 JavaScript 中,承諾以其 then 方法而聞名。承諾有兩個主要狀態’待定’和’已結算’。一旦承諾已經解決,它就無法回到待定狀態。這意味著承諾主要適用於僅發生一次的事件。 settled 狀態有兩個狀態: resolvedrejected。你可以使用 new 關鍵字建立新的承諾,並將函式傳遞給建構函式 new Promise(function (resolve, reject) {})

傳遞給 Promise 建構函式的函式總是接收通常分別名為 resolvereject 的第一個和第二個引數。這兩個引數的命名是慣例,但它們會將承諾置於已解決狀態或已拒絕狀態。當其中任何一個被稱為承諾時,承諾從待定變為已結算。當執行所需的動作(通常是非同步的)並且如果動作有錯誤時使用 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 的更多資訊。