1购笆、Promise概述
比較官方的介紹就是:Promise是異步編程的一種解決方案则剃。從語(yǔ)法上說(shuō)耘柱,Promise 是一個(gè)對(duì)象,從它可以獲取異步操作的消息棍现。
在我理解下调煎,所謂Promise其實(shí)就是一個(gè)通知。就像你期末考試己肮,你不知道老師試卷什么時(shí)候改好士袄,每天都擔(dān)驚受怕自己是否及格。終于到了暑假的某一天谎僻,試卷發(fā)到你手里娄柳,這個(gè)時(shí)候只有兩種結(jié)果:及格或不及格。 也就是Promise中的fulfilled(已成功)和 rejected(已失斔疑堋)赤拒。然而我們等待試卷的過(guò)程就叫pending(進(jìn)行中)。
官方里有這么一句話:除了異步操作的結(jié)果诱鞠,任何其他操作都無(wú)法改變這個(gè)狀態(tài)挎挖。
什么意思呢,也就是航夺,我拿到了試卷蕉朵,及格和不及格這個(gè)狀態(tài)已經(jīng)是事實(shí)了。也就是(已成功) 或 (已失敗) 是沒(méi)辦法改變了阳掐。
定義Promise
它可以定義成功(resolve)返回的數(shù)據(jù)墓造,和失敗(reject)返回的數(shù)據(jù)。
function netPlay(age){
// 定義一個(gè)Promise,然后在里面做一些異步锚烦,等待返回
return new Promise(function(resolve,reject){
setTimeout(function(){
if(age>18){
resolve('你已經(jīng)成年了觅闽,可以去網(wǎng)吧上網(wǎng)了')
}else{
reject('未成年人不準(zhǔn)去網(wǎng)吧!')
}
},3000)
})
}
//又或者封裝小程序的請(qǐng)求
function promiseAjax(_url,type,callback,data){
return new Promise(function (resolve, reject) {//成功的回調(diào)和失敗的回調(diào)
wx.request({
url: _url,
method:type,
data, //如果要上傳數(shù)據(jù)涮俄,就是這個(gè)data
success(res){
resolve(res);
},
fail(err){
reject(err);
}
})
});
}
如果說(shuō)Promise是決定成功與否的命運(yùn)蛉拙,那么then就是我們面對(duì)這些結(jié)果的處理
2、then
官方介紹:then 方法接收兩個(gè)函數(shù)作為參數(shù)彻亲,第一個(gè)參數(shù)是 Promise 執(zhí)行成功時(shí)的回調(diào)孕锄,第二個(gè)參數(shù)是 Promise 執(zhí)行失敗時(shí)的回調(diào)吮廉,兩個(gè)函數(shù)只會(huì)有一個(gè)被調(diào)用。
也就是說(shuō)畸肆,我們這個(gè)暑假考完試后宦芦,老爸跟你講了兩種情況,如果你及格了轴脐,給你買一臺(tái)ps5调卑。如果不及格,罰你洗碗一個(gè)月大咱。
而then就是處理結(jié)果的一個(gè)方法恬涧,分別是成功的回調(diào)(第一個(gè)參數(shù)),和失敗的回調(diào)(第二個(gè)參數(shù))碴巾。 我們還在等待結(jié)果的時(shí)候就可以安排好怎樣應(yīng)對(duì)這個(gè)結(jié)果溯捆。
//定義Promise
function test(mark){
return new Promise(function(resolve,reject){
setTimeout(function(){
if(mark>60){
resolve('及格')
}else{
reject('不及格')
}
},3000)
})
}
//調(diào)用
test(59).then((data)=>{
console.log(data,'去買ps5')
},(err)=>{
console.log(err,'洗碗一個(gè)月') //不及格,洗碗一個(gè)月
})
//當(dāng)然厦瓢,這里因?yàn)椴皇钦{(diào)用接口獲取結(jié)果的提揍,所以59分不及格是預(yù)料之中,但如果我們的setTimeOut換成接口煮仇,根據(jù)每個(gè)學(xué)生獲取他的分?jǐn)?shù)劳跃,那么這個(gè)方法就奏效了。
注意
我們?cè)谇懊嬗姓f(shuō)到欺抗,then的第二個(gè)參數(shù)是用來(lái)接受reject(失敗的回調(diào)),但其實(shí)catch也是接收reject傳遞的數(shù)據(jù)
test(59).then((data)=>{
console.log(data,'去買ps5')
}).catch((err)=>{
console.log(err,'洗碗一個(gè)月') //不及格,洗碗一個(gè)月
})
以上就是我們Promise的基本用法啦强重。
但是還沒(méi)完绞呈,畢竟我也不是很熟,所以只能理解一點(diǎn)更新一點(diǎn)间景。
擴(kuò)展
Promise.All
Promise.all方法執(zhí)行后返回的依舊是promise, all兩個(gè)全成功才表示成功 佃声。
什么意思呢?
終于倘要,你已經(jīng)從上一年的暑假中得到了教訓(xùn)圾亏,努力學(xué)習(xí),終于獲得了質(zhì)的飛躍封拧,從不及格進(jìn)入了新的領(lǐng)域志鹃。拿著60分的試卷去讓老爸買一臺(tái)PS5. 老爸馬上兌現(xiàn)諾言,和你一起去游戲商城買這臺(tái)PS5游戲機(jī)泽西,結(jié)果曹铃,店家說(shuō):'你們做夢(mèng)吧,PS5還沒(méi)出呢捧杉!' 陕见,所以秘血,最終你還是沒(méi)有買到PS5。
這個(gè)方法就是這個(gè)道理评甜,它可以讓我們執(zhí)行多個(gè)異步操作灰粮,并且在同一個(gè)回調(diào)中處理所有的返回?cái)?shù)據(jù)。返回的數(shù)據(jù)和傳的參數(shù)數(shù)組的順序是一樣的忍坷。
function test(mark){
return new Promise(function(resolve,reject){
setTimeout(function(){
if(mark>60){
resolve('及格')
}else{
reject('不及格')
}
},3000)
})
}
function game(date){
return new Promise(function(resolve,reject){
setTimeout(function(){
if(date>2020){
resolve('PS5終于開(kāi)售了')
}else{
reject('你們做夢(mèng)吧粘舟,PS5還沒(méi)出呢!')
}
},3000)
})
}
let result = Promise.all([test(60),game(2020)])
result.then((data)=>{
console.log(data)
}).catch((err)=>{
console.log(err) //你們做夢(mèng)吧承匣,PS5還沒(méi)出呢蓖乘!
})
注意:reject出來(lái)的數(shù)據(jù)只會(huì)是其中一條。就算兩個(gè)異步都是失敗返回韧骗,也只會(huì)返回最后一個(gè)嘉抒。但如果成功,會(huì)返回成功回調(diào)全部數(shù)據(jù)袍暴。