Promise
ES6引入的异步编程的新方案,语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果
Promise状态
待定pending:初始状态,没有被兑现,也没有被拒绝
- 已兑现 fulfilled:操作完成
- 已拒绝 rejected:操作失败
- promise的构造函数接受一个参数,是回调函数,并且回调函数接受两个参数,resolve,reject,分别表示异步操作执行成功后的回调函数和失败后的回调函数
- new Promise()函数是同步执行的,只是用来处理异步
Promise的实例化对象有两个属性 PromiseSata属性:当前Promise实例化对象的状态 ,PromiseResult:当前Promise实例化对象的值
//初始化状态(默认,异步代码还在执行中)
const promise = Promise((resolve,reject)=>{
//同步调用
//执行异步操作/异步代码
setTimeout(()=>{
console.log('setTimeout');
},1000);
})
console.log(promise);
//异步代码执行成功了
//调用resolve函数,可以将promise实例的状态由pending变成resolved,成功的promise实例的值为resolve的参数
const promise = new Promise((resolve,reject)=>{
set Timeout(()=>{
resolve('a数据');
},1000)
})
console.log(promise)
//失败状态,调用reject函数,将实例状态由pending变成rejected,失败的promise实例的值为resolve的参数
const promise = new Promise((resolve,reject)=>{
set Timeout(()=>{
console.log('setTimeout');
reject('失败');
},1000)
})
console.log(promise)
Promise的then方法
Promise.prototype.then,接受两个回调函数作为参数,捕获promise成功或失败的状态,执行成功或失败的回调,成功跟失败的回调函数返回promise实例的值
- then方法的回调函数是异步的,当调用then的实例化的promise实例不再是pending状态时,会执行then中的对应的成功或失败的回调函数
-
then返回值
成功的promise实例调用then方法时
默认:then返回的是一个成功的promise实例,promise实例的值就是当前回调函数的返回值
- 当then中返回的是一个promise实例的时候,then返回的promise实例的状态和值就是回调函数返回的promise实例的状态和值
- 当then的回调函数内部出现报错并没有异常处理,则直接then返回失败的promise实例,值为这个错误
- then中只传递一个值,会直接发生值穿透,then返回成功状态depromise实例,值是调用then的promise实例的值
失败的promise实例调用then方法
- 当then中没有书写关于失败的回调函数的时候,会发生值穿透,直接返回失败,值为调用catch的失败的promise实例的值
成功的promise对象调用catch方法
catch直接返回一个成功的的promise对象,并且值是调用catch的那个成功的promise对象的值
const promise = new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('setTimeout()');
resolve('a数据');
},1000)
});
promise.then((result)=>{
//成功的回调
//当promise对象的状态变成resolved,就会执行当前函数
return 'then';
},(error)=>{
//失败的回调
//当promise对象状态变成rejected,就会执行当前函数
console.log(error);
})
Promise的catch方法
Promise.prototype.catch可以接受一个回调函数作为参数,捕获promise失败的状态,执行的回调
- 规则和then方法中的第二个回调函数一致
成功的promise对象调用catch方法,catch直接返回一个成功的promise实例,并且值是调用catch那个成功的promise实例的值
Promise的finally方法
无论promise实例是否成功失败,都会进入finally中执行
- finally的回调函数不接受参数
finally返回值
- 当finally中的回调函数返回的是失败的pomise对象时,finally返回失败的promise对象,值为回调函数返回promise对象的值
- 当finally的回调函数中出现报错,则finally直接返回失败的promise对象,值为错误信息
- 其他情况一律认为类似穿透
const promise = new Promise((resolve,reject)=>{
});
//promise变成成功/失败都出发。pending不触发
promise.finally(()=>{
console.log('finally');
})
Promise静态方法
Promise.all([promise1,...])
//接收一个promise的iterable(Array,Map,Set都属于es6的iterable类型)类型的输入
//并且只返回一个Promise实例,那个输入的所有promise的resolve回调的结果时一个数组
//这个Promise的resolve回调执行时在所有输入的promise的resolve回调都结束,或者输入的iterable里没有promise了的时候
//它的reject回调执行的是,只要任何一个输入的promise的reject回调执行或者输入不合法的promise就会立即抛出错误,并且reject的时第一个抛出的错误信息
//返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果
//返回一个promise,一旦迭代器中的某个promise解决或拒绝,返回的promise就会解决或拒绝
//接收一个promise可迭代对象,只要其中的一个promise成功,就返回那个已经成功的promise,如果一个都不成功,就返回一个失败的promise和AggregateError类型的实例
//快速得到一个成功状态的promise对象,值为value
//如果value是一个对象,resolve方法返回的promise的状态跟值随内部value的状态和值
//快速得到一个失败状态的promise对象,值为value
//不管value是什么对象,都是这个失败的promise对象的值