Promise其實(shí)就是一個(gè)對(duì)象 , 用來傳遞異步操作的 . 它代表了某個(gè)未來才會(huì)知道結(jié)果的事件( 這通常是一個(gè)異步操作 ) , 并為這個(gè)事件提供統(tǒng)一的API , 讓其可供進(jìn)一步處理 ;
Promise對(duì)象有以下兩個(gè)特點(diǎn):
(1) 對(duì)象的狀態(tài)不受外界影響 .?Promise對(duì)象代表一個(gè)異步操作 , 有三種狀態(tài):Pending( 進(jìn)行中 )、Resolved( 已完成,又稱 Fulfilled )和 Rejected( 已失敗 ). 只有異步操作的結(jié)果 , 可以決定當(dāng)前是哪一種狀態(tài) , 任何其他操作都無法改變這個(gè)狀態(tài) . 這也是 Promise 這個(gè)名字的由來 , 它的英語(yǔ)意思就是「 承諾 」 , 表示其他手段無法改變 ;
(2)一旦狀態(tài)改變 , 就不會(huì)再變 , 任何時(shí)候都可以得到這個(gè)結(jié)果 . Promise 對(duì)象的狀態(tài)改變 , 只有兩種可能 : 從 Pending 變?yōu)?Resolved 和從 Pending 變?yōu)?Rejected . 只要這兩種情況發(fā)生 , 狀態(tài)就凝固了 , 不會(huì)再變了 , 會(huì)一直保持這個(gè)結(jié)果 . 就算改變已經(jīng)發(fā)生了 , 你再對(duì) Promise 對(duì)象添加回調(diào)函數(shù) , 也會(huì)立即得到這個(gè)結(jié)果 . 這與事件( Event )完全不同 , 事件的特點(diǎn)是 , 如果你錯(cuò)過了它 , 再去監(jiān)聽 , 是得不到結(jié)果的 ;有了 Promise 對(duì)象尸疆,就可以將異步操作以同步操作的流程表達(dá)出來度帮,避免了層層嵌套的回調(diào)函數(shù)科展。此外争涌,Promise 對(duì)象提供統(tǒng)一的接口损俭,使得控制異步操作更加容易痹栖。
Promise 也有一些缺點(diǎn)亿汞。首先,無法取消 Promise揪阿,一旦新建它就會(huì)立即執(zhí)行疗我,無法中途取消。其次南捂,如果不設(shè)置回調(diào)函數(shù)吴裤,Promise 內(nèi)部拋出的錯(cuò)誤,不會(huì)反應(yīng)到外部溺健。第三麦牺,當(dāng)處于 Pending 狀態(tài)時(shí),無法得知目前進(jìn)展到哪一個(gè)階段( 剛剛開始還是即將完成 )。
var promise = new Promise( function( resolve , reject ) {
if ( /* 異步操作成功 */ ) {
resolve( value ) ;
} else {
reject( error );
}
} ) ;
promise.then( function ( value ) {
// success
} , ?function( value ) {
// failure
} ) ;
Promise 構(gòu)造函數(shù)接受一個(gè)函數(shù)作為參數(shù) , 該函數(shù)的兩個(gè)參數(shù)分別是 resolve 方法和 reject 方法 .
如果異步操作成功 , 則用 resolve 方法將 Promise 對(duì)象的狀態(tài) , 從「 未完成 」變?yōu)椤?成功 」( 即從 pending 變?yōu)?resolved );
如果異步操作失敗 , 則用 reject 方法將 Promise 對(duì)象的狀態(tài) , 從「 未完成 」變?yōu)椤?失敗 」( 即從 pending 變?yōu)?rejected );