Promise是一個對象,用來傳遞異步操作的消息。它代表了某個未來才會知道結果的事件(通常是一個異步操作),并且這個事件提供統一的API,可供進一步處理。
Promise對象有以下兩個特點:
1、對象的狀態不受外部影響。Promise對象代表一個異步操作,有3種狀態:Pending(進行中)、Resolved(已完成)、Rejected(已失敗)。只有異步操作的結果才可以決定當前是哪種狀態,任何其他操作都無法改變這個狀態。這也是“Promise”這個名字的由來。
2、一旦狀態改變就不會再變,任何時候都可以得到這個結果。
var promise = new Promise(function(resolve, reject){
//some code
if(/*異步操作成功*/){
resolve(value);
} else {
reject(err)
}
});
Promise構造函數接受一個函數作為參數,該函數的兩個參數分別是resolve和reject。它們是兩個函數,由JavaScript引擎提供,不用自己部署。
resolve的作用是,將Promise對象的狀態從“Pending”變為“Resolved”,在異步操作成功時調用,并<b>將異步操作的結果作為參數傳遞出去;</b>
reject的作用是,將Promise對象的狀態從“Pending”變為“Rejected”,在異步操作失敗時調用,并<b>將異步操作報的錯誤作為參數傳遞出去;</b>
Promise實例生成以后,可以用then方法分別指定Resolved狀態和Rejected狀態的回調函數。then方法可以接受兩個回調函數作為參數。第一個回調函數是Promise對象的狀態變為Resolved時調用,第二個回調函數是Promise對象的狀態變為Rejected時調用。其中,第二個函數是可選的,不一定要成功。這兩個函數都接受Promise對象傳出的值作為參數。
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms , 'done');//經測試,第三個參數及后面的參數會被當做resolve函數的參數。
});
}
timeout(100).then((value) => {
console.log(value);
});
<b>如果調用resolve函數和reject函數時帶有參數,那么這些參數會被傳遞給回調函數</b>
上述代碼中,timeout方法返回一個Promise實例,表示一段時間以后才會發生的結果。過了指定時間以后,執行resolve函數,將Promise對象從pending改為Resolved,狀態變為Resolved會調用then方法里的第一個回調函數。同樣,如果將setTimeout里的第一個參數改為resolve的話,Promise對象從pending變為Rejected,狀態變為Rejected會調用then方法里的第二個回調函數。