promise
1.prosmise是一个构造函数,他跟js中的Date,Array,等构造函数类似,都是使用new操作符实例化之后,通过传参和调用方式来完成某些特定功能,promise是专门用来实现多个异步函数,顺序必须是先后顺序执行的技术
1.promise可以理解为承诺,就像我们去店里定制一个东西,如果店家可以做,就会给我们做,这是成功,如果不能就拒绝,这是失败
注意:一个promise必须要有一个then来处理状态的改变
状态说明
1.promise包含三种状态pending,fulfilled,rejected三种状态
-
pending指初始等待状态,初始化promise时的状态
-
resolve 指已经解决,将promise状态设置为 fulfilled
-
rejecte 指拒绝处理,将promise状态设置为rejected
-
promise是生产者,通过reslove 和reject函数告知结果
-
promise非常适合需要一定执行时间的异步任务
-
promise状态一经确定,就不能改变
promise是队列状态,就像体育中的接力赛,状态一直向后传递,当然其中任何一个promise也可以改变状态
promise没有使用resolve或者reject改变状态时候,默认为pending
then相当于监听promise,是一个监听器。then返回的也是一个promise对象,
reject和reslove相当于promise的对象的两个方法,分别对应着promise的两个状态
Promise.all
promise.all将多个promise实例包装成一个新的promise实例,同时成功和失败的返回值不同,成功的时候返回的是一个数组,而失败的时候先返回的最先被reject失败状态的值,如果有多个失败的promise,只返回一个失败状态,就是数组最前面失败的那个promise
let p1 = new Promise(function(resolve,reject){
resolve('成功了')
})
let p2 = new Promise(function(resolve,reject){
resolve('liquan')
})
let p3 = new Promise(function(resolve,reject){
reject('err')
})
let p4 = new Promise(function(resolve,reject){
reject('err1')
})
Promise.all([p1,p2]).then(function(res){
console.log(res);
})//Array(2)
Promise.all([p1,p2,p3]).then(function(res){
console.log(res);
}).catch(function(err){
console.log(err);
})//err
promise.race
就是赛跑的意思,谁最先返回,就是谁的结果最先出来,就返回那个结果,不管是成功状态,还是失败状态
await如果是reject就会报错,要执行try catch就执行
let p1 = new Promise(function(resolve,reject){
setInterval(() => {
resolve('成功了')
}, 1000);
})
let p2 = new Promise(function(resolve,reject){
setInterval(() => {
reject('err')
}, 500);
})
Promise.race([p1,p2]).then(function(res){
console.log(res);
}).catch(function(err){
console.log(err);
}) //err
//不要定时器
let p3 = new Promise(function(resolve,reject){
resolve('成功了')
})
let p4 = new Promise(function(resolve,reject){
reject('err')
})
Promise.race([p3,p4]).then(function(res){
console.log(res);
}).catch(function(err){
console.log(err);
})//成功了
async和await
/*
Async / await 是用来处理异步的,其实是Generator 函数的改进,背后的原理还是promise
*/
console.log(1);
/*
Async:封装的函数返回的是一个promise对象
*/
async function f1(){
return 'abc'; //返回值直接包装成为一个promise对象
//return promise.resolve('abc');
//等价于 return new Promise(function(resolve,reject){resolve('abc')});
}
console.log(f1());
console.log(3);
/*
await 阻塞后面的代码,等当前的代码执行完在执行下面的代码 await 命令后面是一个 Promise 对
象,它也可以跟其他值,如字符串,布尔值,数值以及普通函数。
*/