ES6 Promise 对象

一、概述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值