打印出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方法
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就先到这里,如果有欠缺的,欢迎各位指出,我会加紧改正。