很早之前就聽(tīng)說(shuō)過(guò)promise了白粉,但是一直沒(méi)有時(shí)間深入研究讯壶。這兩天有時(shí)間看了一下揽浙,下面就我自己的理解整理一下promise的相關(guān)知識(shí)状婶。
一意敛,為什么使用Promise?
????promise是js解決異步操作的一種方案,和回調(diào)函數(shù)一樣都是用來(lái)處理異步操作的膛虫。那為什么不繼續(xù)使用回調(diào)函數(shù)而用promise代替呢草姻?
????因?yàn)橛没卣{(diào)函數(shù)的話(huà),代碼邏輯會(huì)有點(diǎn)亂稍刀,它是橫向編寫(xiě)的撩独,如果回調(diào)函數(shù)里的操作還是異步回調(diào)的話(huà),就會(huì)形成回調(diào)地獄账月。而用promise的話(huà)综膀,同樣是處理異步操作,promise的邏輯會(huì)很清晰局齿,我們會(huì)容易理解僧须,promise本質(zhì)是處理異步操作,只是轉(zhuǎn)變了思維和形式项炼。用處理同步的方式處理異步操作担平。也就是形式上像同步操作,而本質(zhì)是異步操作锭部。
二暂论,promise/a+規(guī)范
因?yàn)榛卣{(diào)地獄的困擾,社區(qū)就出現(xiàn)了Promise/a+規(guī)范拌禾,是實(shí)現(xiàn)promise的必須遵循的規(guī)范取胎。它只是一些規(guī)范,所以在不同的框架或平臺(tái)下都有不同的實(shí)現(xiàn)湃窍。實(shí)現(xiàn)了Promise/a+的庫(kù)有:Angular的$q服務(wù)闻蛀,Node中的q模塊,ES6自帶的Promise您市,還有async庫(kù)觉痛,await等。
因?yàn)椴锁B(niǎo)對(duì)規(guī)范不是很精通茵休,只能用通俗的語(yǔ)言來(lái)描述promise/a+規(guī)范薪棒。規(guī)范的內(nèi)容如下:
1,不管進(jìn)行什么操作榕莺,都返回一個(gè)promise對(duì)象俐芯,這個(gè)對(duì)象里會(huì)有一些屬性和方法,
2钉鸯,Promise對(duì)象有三個(gè)狀態(tài):未完成吧史,已完成,失敗唠雕。初始化的promise對(duì)象的狀態(tài)為未完成贸营,未完成狀態(tài)的轉(zhuǎn)變路徑只有兩條吨述,只能從未完成—>已完成,或者未完成---->失敗莽使。狀態(tài)一旦改變則不會(huì)再改變锐极。
3笙僚,這個(gè)promise對(duì)象使用時(shí)必須通過(guò)then方法調(diào)用芳肌,它是實(shí)現(xiàn)異步的鏈?zhǔn)讲僮鞯幕A(chǔ)。
這個(gè)規(guī)范剛開(kāi)始可能看的有點(diǎn)糊涂肋层,不知道在說(shuō)什么亿笤,不要著急,在我們初步了解栋猖,熟練使用promise之后净薛,再自己實(shí)現(xiàn)一個(gè)Promise的時(shí)候才會(huì)慢慢理解它的含義。
三蒲拉,Promise常用方法總結(jié)
說(shuō)了這么多肃拜,Promise到底是個(gè)啥東西?在控制臺(tái)console.dir(Promise)雌团;我們就會(huì)看到燃领,Promise是一個(gè)構(gòu)造函數(shù)。
在Promise的構(gòu)造函數(shù)上有all锦援,race猛蔽,reject,resolve方法灵寺,在Promise的原型上有then曼库,catch方法,也就是構(gòu)造的promise實(shí)例對(duì)象可以執(zhí)行then方法和catch方法略板。
我們創(chuàng)建一個(gè)promise實(shí)例毁枯。
var p =new Promise (function (resolve, reject) {
"use strict";
var a =10;
if (a >0) {
resolve (a )
}else {
reject (a )
}
} );
p.then (function (data) {
"use strict";
console.log ("已完成")
console.log ( data )
},function () {
"use strict";
console.log ("失敗")
} );
resolve和reject是用來(lái)改變promise的狀態(tài)的。
Promise的構(gòu)造函數(shù)接收一個(gè)參數(shù)叮称,是函數(shù)后众,并且傳入兩個(gè)參數(shù):resolve,reject颅拦,分別表示異步操作執(zhí)行成功后的回調(diào)函數(shù)和異步操作執(zhí)行失敗后的回調(diào)函數(shù)蒂誉。按照標(biāo)準(zhǔn)來(lái)講,resolve是將Promise的狀態(tài)置為fullfiled距帅,reject是將Promise的狀態(tài)置為rejected右锨。
then方法接收兩個(gè)可選函數(shù)參數(shù),如果promise的狀態(tài)為fullfiled時(shí)碌秸,第一個(gè)函數(shù)執(zhí)行绍移,如果promise的狀態(tài)為rejected悄窃,第二個(gè)函數(shù)執(zhí)行。如果只有一個(gè)參數(shù)蹂窖,默認(rèn)為fullfiled狀態(tài)執(zhí)行的函數(shù)轧抗。