es6中的Promise机制(异步编程的解决方案)

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

当请求成功时:
在这里插入图片描述
当请求失败时:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值