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);
}