ES6中的Promise对象

打印出Promise,我们能看出Promise是一个构造函数
那什么是Promise?

Promise是异步编程的一种解决方案,它有三种状态, 分别是 pending-进行中 resolved-已完成 rejected-已失败。
Promise执行完成后,只会有成功和失败的状态,并且不可被更改
pending 就绪状态 => resolved 成功状态
pending 就绪状态 => rejected 失败状态
让我们来看一段代码
var p = new Promise(function(resolved,rejected){
    var num = Math.random() * 100;
	if(num < 50){
	    resolved(num);
	        }else{
		    rejected('要不起')
	}
})
状态为 resolved时


状态为 rejected时

当我们定义好P后,P有状态时,还记得打印出Promise的原型上有一个then方法吧
p.then();


里面回传两个函数,是干什么的呢?  别急,还记得我们刚才说的两个状态 resolved 和 rejected 吗?

因为通过 new Promise 会产生一个对象,并且是有状态的,且只留下 resolved 和 rejected 一个。.then后面的函数,就是接收当它是 resolved 时候做什么,当它是 rejected 时候做什么。


当它是 resolved 



当它是 rejected



这里也可以用箭头函数写

p.then(data => data,err => err)


接下来,我继续.then

p.then(data => data,err => err).then(data => console.log(data + 'sec'),err => console.log(err + 'err'))

结果



第一个结果末尾是sec没有错,但为什么第二个结果也是sec而不是err呢?

记得开篇说的  只有成功和失败状态,并且不可被更改吗?

第一次then时,无论结果是 resolved 还是 rejected,他俩始终是常量,是常量的话,就会默认状态为 resolved。

仔细想想是不是这样?


让我们继续


.then()会返回一个Promise对象,一旦是Promise对象,就一定会有状态。接下来,我们再返回一个Promise对象

p.then(data => new Promise((resolved,rejected) => resolved(123)),err => err)
.then(data => console.log(data + 'sec'),err => console.log(err + 'err'))


data返回了一个 Promise的对象,让它 resolved 并返回123



如果将 resolved 改为 rejected

p.then(data => new Promise((resolved,rejected) => rejected(123)),err => err)
.then(data => console.log(data + 'sec'),err => console.log(err + 'err'))

输出结果


Promise的all方法

        var p1 = new Promise((resolved,rejected) =>{
		var num = Math.random() * 100;
			resolved(num + 'p1')
	})
	var p2 = new Promise((resolved,rejected) =>{
		var num = Math.random() * 100;
			resolved(num+ 'p2')
	})
	var p3 = new Promise((resolved,rejected) =>{
		var num = Math.random() * 100;
			rejected(num+ 'p3')//这里我们设置为rejected
	})
	Promise.all([p1,p2,p3]).then(data => console.log(data),err => console.log(err + 'aaa'))
打印结果为

只有在Promise的对象都是resolved的时候,它才可以返回。如下

        var p1 = new Promise((resolved,rejected) =>{
		var num = Math.random() * 100;
			resolved(num + 'p1')
	})
	var p2 = new Promise((resolved,rejected) =>{
		var num = Math.random() * 100;
			resolved(num+ 'p2')
	})
	var p3 = new Promise((resolved,rejected) =>{
		var num = Math.random() * 100;
                       resolved(num+ 'p3')//这里我们设置为resolved
	})
Promise.all([p1,p2,p3]).then(data => console.log(data),err => console.log(err + 'aaa'))
打印结果为

可以看到全被返回并输出


Promise的race方法

Promise的all()方法是全部,而Promise的race是指有一个就可以了,并且谁先到,我用谁。
        var p1 = new Promise((resolved,rejected) =>{
		var num = Math.random() * 100;
			setTimeout(function(){
				resolved('p1')
			},Math.random() * 500)
	})
	var p2 = new Promise((resolved,rejected) =>{
		var num = Math.random() * 100;
			setTimeout(function(){
				resolved('p2')
			},Math.random() * 500)
	})
	var p3 = new Promise((resolved,rejected) =>{
		var num = Math.random() * 100;
			setTimeout(function(){
				resolved('p3')
			},Math.random() * 500)
	})
Promise.race([p1,p2,p3]).then(data => console.log(data),err => console.log(err + 'aaa'))

输出结果



关于Promise就先到这里,如果有欠缺的,欢迎各位指出,我会加紧改正。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值