一、介绍
Promise对象是一个代理对象,一个代表未知返回结果的对象值。这个值在Promise对象创建时可能是未知的,它允许你为异步操作的成功和失败分别绑定相应的处理方法, 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是返回一个能代表未来出现的结果的promise对象
二、使用
new Promise(executor)
executor:一个带有两个参数(resolve和reject)的方法,resolve为fulfilled状态,即成功之后调用,reject为rejected状态,即失败之后调用。
即:new Promise(function(resolve, reject){})
1、executor在创建Promise对象时立即调用
2、若executor函数中抛出错误,promise状态为rejected,executor函数返回值被忽略
三、状态
pending:初始状态
fulfilled:成功状态
rejected:失败状态
1、fulfilled、rejected被统称为settled,fulfilled也可被称为resolved
2、只有两种状态变化过程:pending → fulfilled,pending → rejected,且状态只可变化一次,一旦发生变化便会一直保持这个结果。
四、属性
1、length:Promise构造器参数个数,始终为1(唯一参数executor)
2、prototype:构造器原型
五、方法
1、Promise.prototype.then(resolve[, reject])
resolve为成功回调函数,reject为失败回调函数(可选),参数为Promise实例返回值
2、Promise.prototype.catch(reject)
处理内容包括:① rejected状态对应返回结果,② catch方法前抛出的错误
3、Promise.prototype.finally()
Promise实例最终必须执行的操作
4、Promise.all([p1, p2, ... , p(n)])
p(n)(n = 1, 2, ... )均为Promise实例
① 只有参数中所有Promise实例的状态都为fulfilled,该方法返回的Promise实例状态为fulfiiled
② 参数中返回Promise实例的状态为rejected的数量大于等于1,该方法返回的Promise实例状态为rejected,返回数据为第一个状态变为rejected的参数方法返回结果
***注:返回Promise实例的状态为rejected,即Promise实例的状态为rejected,且没有catch方法做异常处理
5、Promise.race([p1, p2, ... , p(n)])
p(n)(n = 1, 2, ... )均为Promise实例
参数中任一Promise实例状态改变,该方法状态更新为相同状态,并且将该实例的返回结果作为参数传给该方法的回掉函数
6、Promise.resolve([p])
将p转换为一个Promise实例
p的值可以为:
① Promise实例p
该方法将不做任何处理,直接返回p本身
② 含有then方法的对象p
该方法将p转换为Promise实例,并且立即执行p中的then方法
③ 不含有then方法的对象,或者不是对象的p
该方法将p转换为Promise实例,状态为fulfilled
并将p传递给Promise实例回调函数resolve
④ 无参数
该方法将p转换为Promise实例
***注:该方法执行之后立即执行resolve,是在当前事件循环的结束时
eg:
// ①
setTimeout(function () {
console.log(3);
}, 0);
// ②
Promise.resolve().then(function () {
console.log(2);
});
// ③
console.log(1);
// 运行结果:
// 1
// 2
// 3
① 在下一轮事件循环开始执行,② 在当前时间循环结束时执行,③ 立即执行
7、Promise.reject(p)
将p转换为一个Promise实例,并立即执行reject,且回调函数的参数为p
8、Promise.try(p)
p为Promise实例
该方法相当于try{}catch(){},Promise.try(p)返回的Promise实例通过catch()既可以捕获同步错误,也可以捕获异步错误
**注:所有方法返回值均为新的Promise实例,因此都可链式调用
六、特点
1、优点:
① 通过同步的表达方式进行异步操作
② 统一的接口
2、缺点:
① 一旦创建、无法取消
② promise返回的信息只能通过回调函数传递到promise对象外部