1.作用
es中没有多线程,但是可以有异步操作;
promise就是异步编程的解决方案
promise本身是一个构造函数:
2.创建
var p1=new Promise((resolve,reject)=>{
resolve:函数,当请求成功之后执行
reject:函数,当请求失败时执行
//执行异步操作
});
3.api
非静态:
- then:
实例对象调用
p1.then(success,error);//success和error都是一个函数 - catch:
捕获异常,不让代码报错报死
then中的任何一个回调报错都会执行该方法 - finally:
无论成功失败都执行该回调
静态:
- all:
all统一执行完三个函数并将成功的值存在一个数组里面返回给then进行回调输出,如有有一个执行为reject-》all的then执行失败回调 - race:
all是等所有的异步操作都执行resolve再执行then方法,那么race方法就是相反的,谁先执行完成就先执行回调。先执行完的不管是进行了race的成功回调还是失败回调,其余的将不会再进入race的任何回调
4.应用:
1.
setTimeout(function(){
console.log("异步操作");
})
2.then测试
var p=new Promise((resolve,reject)=>{
setTimeout(function(){
var num=Math.ceil(Math.random()*10);
if(num>=5){
resolve(num+":num>=5");
}else{
reject(num+":num<5");
}
},2000);
});
p.then(function(data){
console.log("success-then:",data);
},function(data){
console.log("error-then:",data);
})
当请求成功时:
当请求失败时:
3.catch测试
p.then(function(data){
console.log(num);
console.log("success-then:",data);
},function(data){
console.log("error-then:",data);
}).catch(function(reason){
console.log('reason',reason)
})
上面打印num必然会报错,因为num未定义
请求成功时:
4.finally测试
p.then(function(data){
console.log("success-then:",data);
},function(data){
console.log("error-then:",data);
}).catch(function(reason){
console.log('reason',reason)
}).finally(function(){
console.log('刷新操作');
})
不管成功或失败,都会执行finally操作
5.all测试:
function getdata1(){
var p=new Promise((resolve,reject)=>{
setTimeout(function(){
var num=Math.ceil(Math.random()*10);
console.log('随机数为:'+num);
if(num>=5){
resolve(num+':num>=5');
}else{
reject(num+':num<5');
}
},2000)
})
return p
}
function getdata2(){
var p1=new Promise((resolve,reject)=>{
setTimeout(function(){
var num=Math.ceil(Math.random()*10);
console.log('随机数为:'+num);
if(num>=5){
resolve(num+':num>=5');
}else{
reject(num+':num<5');
}
},2000)
})
return p1
}
function getdata3(){
var p2=new Promise((resolve,reject)=>{
setTimeout(function(){
var num=Math.ceil(Math.random()*10);
console.log('随机数为:'+num);
if(num>=5){
resolve(num+':num>=5');
}else{
reject(num+':num<5');
}
},2000)
})
return p2;
}
Promise.all([getdata1(),getdata2(),getdata3()]).then(function(data){
console.log('success',data);
},function(data){
console.log('error',data);
})
运行截图:
6.异步请求
var promise=new Promise((resolve,reject)=>{
console.log("异步请求开始啦-----");
//发送异步请求
var request=new XMLHttpRequest();
request.open("get","http://47.106.244.1:8099/manager/category/findAllCategory");
request.setRequestHeader("Accept",'application/json');
request.send();
request.onreadystatechange=function(){
if(request.readyState == 4){
if(request.status===200){
console.log(request.response,'-----');
resolve(request.response);//调用resolve
}else{
reject(request.status);//调用reject
}
}
}
});
p1.then(function(data){//声明resolve和reject函数
console.log('success:',data);
},function(data){
console.log('error:',data);
})
当请求成功时:
当请求失败时: