Promise
什麼是異步
- 有一個步驟,A執行完再執行B
- 在程序上怎麼實現A執行完再執行B呢,這個步驟有兩種方式,一種是回調方式,另一種事件觸發的方式
- Promise是區別於以上兩種方式的
Promise的作用
Promise的基本用法
{
let ajax = function(callback){
console.log('執行');
setTimeout(function(){
callback&&callback.call()
},2000)
};
ajax(function(){console.log('timeout1')})
}
{
let ajax = function(){
console.log('執行2')
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve()
},2000);
})
};
ajax().then(function(){
console.log('promise','timeout2');
},function(){
})
}
{
let ajax = function(){
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve();
},2000)
})
}
ajax().then(function(){console.log('resolve')})
}
{
let ajax = function(){
console.log('then1')
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve();
},2000)
})
}
ajax()
.then(function(){
console.log('then2')
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve();
},2000)
})
})
.then(function(resolve,reject){
console.log('then3')
setTimeout(function(){
resolve()
},2000)
})
}
{
let ajax = function(num){
console.log('then1')
return new Promise(function(resolve,reject){
if(num>5){
resolve();
}else{
throw new Error('出錯了')
}
})
}
ajax(4).then(function(){
console.log('log',6);
}).catch(function(error){
console.log('catch',error)
})
}
Promise.all 、Promise.race 兩個方法的使用場景
- 前端fade流
- fade流內容會有多圖的形式,比三張圖加載,三張圖會有覆蓋廣告,一個個加載會有閃爍,用戶體驗不好,三張圖同時加載完再添加到頁面上,這樣用戶就看不到圖片加載的過程也看不到閃爍,不然加載三張圖的時間會有前有後,由於網絡延時,有些圖片加載成功,有些圖片加載失敗
- 假設使用Promise,三張圖片全部加載成功之後再添加到頁面上,提高用戶體驗
{
function loadImg(src){
return new Promise((resolve,reject)=>{
let img = document.createElement('img');
img.src = src
img.onload = function(){
resolve(img);
}
img.onerror = function(err){
reject(err);
}
})
}
function showImgs(imgs){
imgs.forEach(img=>document.body.appendChild(img));
}
Promise.all([
loadImg(''),
loadImg(''),
loadImg('')
]).then(showImgs);
}
{
function loadImg(src){
return new Promise((resolve,reject)=>{
let img = document.createElement('img');
img.src = src
img.onload = function(){
resolve(img);
}
img.onerror = function(err){
reject(err);
}
})
}
function showImgs(img){
let p = document.createElement('p');
p.appendChild(img);
document.body.appendChild(p);
}
Promise.race([
loadImg(''),
loadImg(''),
loadImg('')
]).then(showImgs);
}