promise是異步編程的一種解決方法,比回調(diào)函數(shù)和事件更強(qiáng)大更合理。
所謂promise簡單說就是一個(gè)容器,里面保存著未來才會(huì)結(jié)束的事件(通常是一個(gè)異步操作的結(jié)果),從語法上說promise是一個(gè)對(duì)象,從它可以獲取異步操作的消息。
promise對(duì)象有兩個(gè)特點(diǎn):
1.對(duì)象的狀態(tài)不受外界影響。promise對(duì)象代表一個(gè)異步操作,有三種狀態(tài):pending(進(jìn)行中),resolved(已完成)和reject(已失敗)。只有異步操作的結(jié)果可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無法改變這個(gè)狀態(tài)。這也是promise這個(gè)名字的由來。表示其他手段無法改變。
2.一旦狀態(tài)改變就不會(huì)在變,任何時(shí)候都可以得到這個(gè)結(jié)果。promise對(duì)象的狀態(tài)改變只有兩種可能:從pending變?yōu)閞esolved,從pending變?yōu)閞ejected。只要這兩種狀況發(fā)生,狀態(tài)就會(huì)凝固了,不會(huì)在變了,會(huì)一直保持這個(gè)結(jié)果。就算改變已經(jīng)發(fā)生了,即使調(diào)用回調(diào)函數(shù)也還是這個(gè)結(jié)果。這與事件(Event)完全不同,事件的特點(diǎn)是如果你錯(cuò)過了,再去監(jiān)聽它,是得不到結(jié)果的。
promise優(yōu)點(diǎn)
有了promise對(duì)象,就可以把異步操作以同步操作的流程表達(dá)出來,避免了層層嵌套的回調(diào)函數(shù)。此外,promise對(duì)象提供了統(tǒng)一的接口,使得控制異步操作更簡單。
缺點(diǎn)
1.無法取消promise,一旦創(chuàng)建就立即執(zhí)行,無法中途取消
2.如果不設(shè)置回調(diào)函數(shù),promise內(nèi)部拋出錯(cuò)誤,不會(huì)反映到外部
3.當(dāng)處于pending狀態(tài)時(shí),無法得知目前進(jìn)展到那個(gè)階段(剛剛開始還是即將完成)