一、概述
1、异步编程的一种解决方案。从Promise对象可以获取异步操作的信息。
2、一旦创建就会立即执行,无法中途取消。
3、在平时的异步处理过程中,经常需要顺序处理异步操作,需要在每个异步操作完成时,再去嵌套调用另外操作,形成回调地狱。
4、Promise通过链式操作可以顺序处理操作。降低了编码难度,增强了 代码可读性。
二、Promise()构造函数
创建一个Promise实例,接受一个函数作为参数,该函数的两个参数分别是resolve和reject
const p1 = new Promise(function(resolve,reject){
//将Promise对象的状态从 进行中 变为 已成功
resolve('异步操作成功,这里可以放异步处理结果');
//将Promise对象的状态从 进行中 变为 已失败
reject('异步操作失败,这里可以放异常信息等');
});
三、Promise实例状态
1、pending(进行中):对象内部的异步请求正在进行,无法获取请求进行到哪一步。
2、fulfilled(已成功):在Promise中的异步请求成功时,调用Promise的resolve回调函数。
3、rejected(已失败):在Promise中的异步请求失败(异常)时,调用Promise的reject回调函数。
注:只要状态从pending变为fulfilled、rejected,状态就不会在变化。
四、异步操作结果处理
then(fcuntion(res){},function(err){})方法:
1、接收两个函数作为参数,第一个函数,是 Promise 状态是成功时(即调用resolve)的回调;第二个函数,是 Promise 状态是失败时(即调用reject)的回调。
注:通常使用catch()方法代替then()第二个参数,即then()方法中通常只传递第一个函数,处理成功。失败处理统一使用catch()方法。
2、在Promise状态在padding中时,then()方法的回调函数永远不会被调用。
const p1 = new Promise(function(resolve,reject){
//将Promise对象的状态从 进行中 变为 已成功
resolve('异步操作成功,这里可以放异步处理结果');
//将Promise对象的状态从 进行中 变为 已失败
reject('异步操作失败,这里可以放异常信息等');
});
p1.then(function(res){
console.log('异步操作成功',res);
},function(err){
console.error('异步操作失败',err);
})
3、Promise可以通过.then链式添加多个回调函数,回调函数会按照插入的顺序独立运行。
1、在.then中可以return一个新的promise,在下一个.then中会接收到上一个.then返回的promise的resolve的值
2、在.then中可以return一个值(相当于返回了一个resolve的promise),在下一个.then中会接收到上一个.then返回的值
const p1 = new Promise(function(resolve,reject){
resolve('异步操作成功,这里可以放异步处理结果');
reject('异步操作失败,这里可以放异常信息等');
});
p1.then(function(res){
console.log('第一个then',res);
return new Promise((resolve,reject) => {
resolve('第一个then返回的值')
})
}).then(function(res){
console.log('第二个then接收到第一个then resolve的值',res);
return '第二个then返回的值'
}).then(function(res){
console.log('第三个then接收到第二个then return的值',res);
}).then(function(res){
console.log('第四个then',res);
},function(err){
console.error('异步操作失败',err);
})
catch(function(err){})方法:
catch()方法是.then(null, rejection)或.then(undefined, rejection)的别名,用于指定发生错误时的回调函数。一般来说,使用catch方法代替then()第二个参数。Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。
finally(function(){})方法:
不管 Promise 对象最后状态是成功、失败,都会执行。
五、Promise对象的静态方法:
Promise.all(iterable)方法:
接收一个 promise 的 iterable 类型(注:Array,Map,Set 都属于 ES6 的 iterable 类型)的输入,并且只返回一个Promise实例,这个Promise实例的回调执行情况:(所有都成功才成功,一个失败就失败)
1、resolve 回调:接收的所有promise 的resolve 回调都结束。或者没有了输入的promise。
2、reject 回调:只要任何一个输入的 promise 的 reject 回调执行或者输入不合法的 promise 就会立即抛出错误,并且 reject 的是第一个抛出的错误信息。
Promise.allSettled(iterable)
接收一个 promise 的 iterable 类型(注:Array,Map,Set 都属于 ES6 的 iterable 类型)的输入,并且只返回一个Promise实例,这个Promise实例的回调执行情况:(不管输入的promise成功还是失败,全部都执行完成后,回调返回每个promise的执行状态)
当有多个彼此不依赖的异步任务成功完成时,或者想知道每个promise的结果时,通常使用它。
Promise.allSettled([promise1,promise2]).
then((results) => {
//results 包含每个promise执行的状态
results.forEach((result) => console.log(result.status))
});
Promise.any(iterable)
和Promise.any(iterable)相反。
接收一个 promise 的 iterable 类型(注:Array,Map,Set 都属于 ES6 的 iterable 类型)的输入,并且只返回一个Promise实例,这个Promise实例的回调执行情况:(一个成功就成功,所有失败才失败)
1、resolve 回调:只要其中的一个 promise 成功,就返回那个已经成功的 promise
2、reject 回调:所有的 promises 都失败/拒绝,就返回一个失败的 promise 和AggregateError类型的实例
Promise.race(iterable)
返回一个 promise,一旦迭代器中的某个 promise 解决或拒绝,返回的 promise 就会解决或拒绝。这个Promise实例的回调执行情况:(一个完成就完成,取决于第一个执行完成的promise,不管成功或失败)
Promise.reject(err)
返回一个带有拒绝原因的 Promise 对象(失败状态)。
Promise.resolve(value)
返回一个以给定值解析后的 Promise 对象(成功状态)。
如果value是一个 promise ,那么将返回这个 promise ;如果value是 thenable(即带有 “then” 方法),返回的 promise 会“跟随”这个 thenable 的对象,采用它的最终状态;否则返回的 promise 将以此值完成。
注意:不要在解析为自身的 thenable 上调用Promise.resolve。这将导致无限递归
错误示例:
let thenable = {
then: (resolve, reject) => {
resolve(thenable)
}
}
Promise.resolve(thenable) //这会造成一个死循环
参考链接: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise