一贬媒、什么是Promise
????????ECMAscript 6 提供了 Promise 對象矗蕊。Promise 是異步編程的一個解決方案,不同于回調(diào)患雏,里面保存著某個未來才會結(jié)束的事件(通常是一個異步操作(定時器茅茂,ajax捏萍,圖片加載))的結(jié)果。所謂Promise空闲,就是一個容器照弥,裝的就是異步的操作(未來才會產(chǎn)生的事情)。Promise 是一個對象进副,從它可以獲取異步操作的消息这揣。
二、Promise的特點
? ? ? ? 1.對象的狀態(tài)不受外界影響影斑。Promise對象代表一個異步操作给赞,有三種狀態(tài):pending(進(jìn)行中)、fulfilled(已成功)和rejected(已失斀没А)片迅。任何其他操作都無法改變這個狀態(tài)。(某些時候用resolved(已完成)來代替fulfiller(已成功)的狀態(tài))
? ? ? ? 2.一旦狀態(tài)改變皆辽,就不會再變柑蛇。Promise對象的狀態(tài)改變只有兩種可能:從pending-->resolved和從pending-->rejected。
三驱闷、基本寫法
? ? ? ? 下面用一個小例子向大家展示promise的基本寫法:
可以看到打印出來的是成功耻台。當(dāng)const a=false時,打印結(jié)果為失敗空另。
????????Promise構(gòu)造函數(shù)兩個參數(shù)分別是resolve和reject盆耽。resolve是異步操作成功時需要執(zhí)行的 reject是異步操作失敗時需要執(zhí)行的。
四扼菠、用Promise對象實現(xiàn)的 Ajax 操作
?? ? ? ? 下面寫一個簡單的例子:
可以看出析恢。all是所有異步操作全部執(zhí)行完畢,才執(zhí)行的then秧饮。而race則是只接收最快的異步數(shù)據(jù)映挂。
五泽篮、promise中的then
? ? ? ? Promise實例生成以后就具有then方法了,因為then方法是定義在原型對象Promise.prototype上的袖肥。promise.then() 是 promise 最為常用的方法咪辱,可以用then方法分別指定resolved狀態(tài)和rejected狀態(tài)的回調(diào)函數(shù)振劳。其中rejected狀態(tài)的回調(diào)函數(shù)是可選的椎组。?解決ajax1的返回的數(shù)據(jù)在ajax2里面使用,每個ajax放到一個Promise對象里面历恐。p1.then放到p2的Promise對象里面執(zhí)行寸癌。then 可以一直往下走,可以有多個弱贼。而catch是錯誤執(zhí)行的代碼蒸苇,只能有一個,并且放在所有then之后執(zhí)行吮旅。
六溪烤、Promise 優(yōu)缺點
? ? ? 有了 Promise 對象,就可以將異步操作以同步操作的流程表達(dá)出來庇勃,避免了層層嵌套的回調(diào)函數(shù)檬嘀。此外,Promise 對象提供統(tǒng)一的接口责嚷,使得控制異步操作更加容易鸳兽。
? ? ? Promise 也有一些缺點。首先罕拂,無法取消 Promise揍异,一旦新建它就會立即執(zhí)行,中途不能取消爆班。其次衷掷,如果不設(shè)置回調(diào)函數(shù),Promise 內(nèi)部拋出的錯誤柿菩,不會反應(yīng)到外部棍鳖。第三,當(dāng)處于 Pending 狀態(tài)時碗旅,無法得知目前進(jìn)展到哪一個階段(剛剛開始還是即將完成)渡处。
? ? ? ? ? ? 總結(jié)的可能有點亂不是很完整。有好的意見可以交流噢~