JavaScript 之 Promise
Promise 對象用于異步計算。一個 Promise 對象表示一個現在或者將來或者永不可用的值。
語法
new Promise(
/** executor */
function(resolve, reject){
...
}
)
參數
-
executor:
一個函數,該函數的參數為:resolve 和 reject。executor 函數在實現 Promise 對象時立即被調用,甚至在 Promise 的構造函數返回之前就被執行,
resolve 和 reject 會被傳入。resolve 和 reject 都是函數,executor 通常初始化一些異步工作,之后,一旦完成,會調用 resolve 函數清理 promise,
或者在發送錯誤時調用 reject 拒絕 promise。
描述
Promise 對象是一個 ’值‘的代理,該’值‘在 promise 對象創建時可能是未知的。它允許你為異步操作的事件結果“成功返回的值”或“失敗”綁定一個處理方法。
這使得異步方法可以像同步方法那樣返回值;不同于立即返回最終結果,異步方法返回一個 promise 對象,可以在未來提供一個值。
Promise 有以下幾種狀態:
- pending:初始狀態,既不是 fulfilled 也不是 rejected。
- fulfilled:表示成功完成操作。
- rejected:表示該操作失敗。
pending 狀態的 promise 對象可以通過一個值轉換為 fulfilled 或者 rejected 狀態。當狀態發送轉換時,promise.then 綁定的方法就會被調用。
因為 Promise.prototype.then 和 Promise.prototype.catch 方法返回 promise 對象,所以它們可以被鏈式調用(一種被稱為 composition 的操作)。
屬性
-
Promise.length
長度屬性,值為 1,構造器參數的數量。
-
Promise.prototype
表示 Promise 構造器的原型。
方法
-
Promise.all(iterable)
這個方法返回一個新的 promise 對象,該 promise 對象在 iterable 里所有的 promise 對象都成功的時候才會觸發成功,
一旦有任何一個 iterable 里面的 promise 對象失敗則立即觸發該 promise 對象的失敗。這個新的 promise 對象在觸發成功狀態以后,
會把一個包含 iterable 里所有 promise 返回值的數組作為成功回調的返回值,順序跟 iterable 的順序保持一致;
如果這個新的 promise 對象觸發了失敗狀態,它會把 iterable 里第一個觸發失敗的 promise 對象的錯誤信息作為它的失敗錯誤信息。
Promise.all 方法常被用于處理多個 promise 對象的狀態集合。
-
Promise.race(iterable)
當 iterable 參數里的任意一個子 promise 成功或失敗后,父 promise 馬上也會用子 promise 的成功返回值或失敗詳情作為參數調用
父 promise 綁定的相應方法,并返回該 promise 對象。
-
Promise.reject(reason)
調用 Promise 的 reject 方法,并返回這個 Promise 對象。
-
Promise.resolve(value)
用成功值 value 完成一個 Promise 對象。如果該 value 帶有 then 方法,返回的 Promise 對象會跟隨這個 value,采用這個 value 的最終狀態;
否則的話返回值會用這個 value 滿足(fulfilled)返回的 Promise 對象。
Promise 原型
屬性
-
Promise.prototype.constructor
返回創建了實例原型的函數,默認為 Promise 函數。
方法
-
Promise.prototype.catch(onRejected)
添加一個 rejection 回調到當前 promise ,返回一個新的 promise。如果這個回調被調用,新 promise 將以它的返回值來 resolve,否則如果當前
promise 進入 fulfilled 狀態,則以當前 promise 的成功結果作為新 promise 的成功結果。
-
Promise.prototype.then(onFulfilled, onRejected)
添加一個成功和失敗回調到當前 promise,返回一個新的 promise,將以回調的返回值來 resolve。
示例
下面例子展示了 Promise 的機制。每當按鈕被點擊時,testPromise() 方法就會被執行。該方法會創建一個用 window.setTimeout 1 到 3 秒后完成的 promise。
這里通過了 p1.then 方法的滿足回調,簡單的輸出了 promise 的滿足過程,這些輸出顯示了該方法的同步部分是如何和 promise 的異步完成解耦的。
<button onclick="testPromise();">點我</button>
<div id="log"></div>
<script>
'use strict';
var promiseCount = 0;
function testPromise() {
var thisPromiseCount = ++promiseCount;
var log = document.getElementById('log');
log.insertAdjacentHTML('beforeend', thisPromiseCount + ') 開始(同步代碼開始)<br/>');
// 創建一個新的promise: 然后用完成這個promise
var p1 = new Promise(function (resolve, reject) {
// 完成函數帶著完成(resolve)或拒絕(reject)promise 的能力被執行
log.insertAdjacentHTML('beforeend', thisPromiseCount + ') Promise開始(異步代碼開始)<br/>');
// 這只是個創建異步完成的示例
window.setTimeout(function () {
// 我們滿足(fullfil)了這個promise!
resolve(thisPromiseCount)
}, Math.random() * 2000 + 1000);
});
// 定義當promise被滿足時應做什么
p1.then(function (val) {
// 輸出一段信息和一個值
log.insertAdjacentHTML('beforeend', val + ') Promise被滿足了(異步代碼結束)<br/>');
});
log.insertAdjacentHTML('beforeend', thisPromiseCount + ') 建立了Promise(同步代碼結束)<br/><br/>');
}
</script>
來自:http://svend.cc/posts/36621/