介紹
es6中加入了promise來統(tǒng)一規(guī)范異步行為。promise中可以接收兩個(gè)參數(shù)院究,res代表成功獲得異步的值以后運(yùn)行什么方法,rej代表失敗以后運(yùn)行什么方法芳杏。
let timer = new Promise((res,rej)=>{
setTimeout(()=>{
res("promise");
},1000)
})
//直接把方法名傳入promise對(duì)象即可
function res(val){
console.log(val)
}
promise對(duì)象的缺點(diǎn):
1.創(chuàng)建的時(shí)候就會(huì)立刻執(zhí)行身害;
2.一旦開始就不能停止擦盾;
3.必須通過catch返回錯(cuò)誤除嘹,否則不會(huì)彈出錯(cuò)誤展鸡。
// 這樣的寫法是錯(cuò)的姨丈,因?yàn)镻romise對(duì)象創(chuàng)建的時(shí)候就會(huì)立即執(zhí)行
let timer = new Promise((res,rej)=>{
setTimeout(()=>{
console.log("promise");
},1000)
})
promise 在處理多個(gè)異步函數(shù)執(zhí)行的時(shí)候畅卓,有很大的優(yōu)勢,
尤其是他在處理正確和錯(cuò)誤的時(shí)候蟋恬,分的特別明確翁潘,
他唯一的缺點(diǎn)是當(dāng)你需要一個(gè)隊(duì)列的時(shí)候,你就需要一個(gè)then一個(gè)then往下寫筋现,
非常難受唐础。
這里就為es7中async和await的誕生埋下了伏筆。
let timer1 = function(){
let p = new Promise((res,rej)=>{
setTimeout(()=>{
console.log("我是timer1");
// res必須包含矾飞,沒有這個(gè)東西你的函數(shù)觸發(fā).then
// 表示成功后返回的內(nèi)容
res('timer1成功后返回的內(nèi)容');
},1500)
})
return p;
}
let timer2 = function(){
let p = new Promise((res,rej)=>{
setTimeout(()=>{
console.log("我是timer2");
res('timer2成功后返回的內(nèi)容');
},500)
})
return p;
}
let timer3 = function(){
let p = new Promise((res,rej)=>{
setTimeout(()=>{
console.log("我是timer3");
res('timer3成功后返回的內(nèi)容');
},1000)
})
return p;
}
// 單個(gè)調(diào)用
timer1().then((data)=>{
console.log(data);
})
// 連續(xù)調(diào)用
timer1().then((data)=>{
console.log(data);
return timer2();
}).then((data)=>{
console.log(data);
return timer3();
}).then((data)=>{
console.log(data);
})
//通過all方法調(diào)用 注意 這個(gè)方式是并行執(zhí)行的 無法決定順序
Promise.all([timer1(), timer2(), timer3()]).then(function(results){
console.log(results);
});
另外這里再介紹兩個(gè)不太常用的東西:
1.跟then相對(duì)的方法一膨,是catch,也可以一個(gè)catch接著一個(gè)往下寫洒沦,是一樣的豹绪。
2.然后all方法,是按照隊(duì)列里面速度最慢的那個(gè)去執(zhí)行的申眼,
他還有一個(gè)race方法瞒津,是誰速度快先執(zhí)行誰,但是還是并行的括尸,無法解決隊(duì)列的問題巷蚪。