简要说明
Promise对象用于表示一个异步操作的最终完成/失败,及其结果值。
new Promise(executor)
executor = function(resolve, reject){…}
executor是一个参数为resolve和reject的函数。该函数由Promise构造函数在执行的时候立即调用executor函数,resolve和reject两个函数作为参数传递给executor。executor函数在Promise构造函数返回所建Promise实例对象前被调用,
executor内部通常会执行一些异步操作,一旦异步操作完成,会调用resolve函数将promise状态改为完成,不然就会因为发生错误而失败。如果一个错误在executor函数中被抛出,promise就被拒绝,同时executor函数的返回值会被忽略。
一个Promise对象是一个代理对象。被代理的值在promise创建的时候是未知的。它允许你为异步操作的成功和失败分别绑定对应的处理方法。这让异步方法像同步方法一样返回值。但不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象。
一个promise对象有以下几种状态:
- pending:初始状态,既非成功也非失败
- fulfilled:操作成功完成。
- rejected:操作失败
pending状态的Promise对象可能会变为fulfilled状态并传递一个值给对应的状态处理方法,也可能变为rejected状态并传递失败信息。当其中任一情况出现时,Promise对象的then方法绑定的处理方法就会被调用。
Promise的then方法,包含两个参数:onfulfilled和onrejected,都是Function类型。
- 当Promise状态为fulfilled时,调用then的onfulfilled方法;
- 当Promise状态为rejected时,调用then的onrejected方法。
所以在异步操作的完成和绑定处理方法之间不存在竞争。
因为Promise.prototype.then 和 Promise.prototype.catch方法返回promise对象,所以他们可以被链式调用。
三种状态下的promise
以下是三种不同状态下Promise对象可能的值
- Fulfilled。
- 另一个非promise的值
- 尽快调用任何已通过的完成的处理操作的准备操作
- 另一个状态为fulfilled的promise
- Rejected。
- 直接被拒绝
- 尽快调用任何已通过的失败的处理操作的准备操作
- 另一个状态为rejected的promise
- Pending
- 即将尽快调用Fulfilled或是Rejected的处理程序
- 另一个状态为pending的promise
属性
length
值为1,构造器参数的数量
prototype
表示Promise构造器的原型。
方法
Promise.all(iterable)
返回一个新的promise对象。
iterable是一个迭代器对象,比如Array或String。
当可迭代对象中的所有promise状态为成功时,该promise对象才成功。并返回一个包含可迭代对象中所有promise返回值的数组作为成功回调的返回值。这个数组中元素的顺序与可迭代对象中元素的顺序保持一致。一旦可迭代对象中任一promise被拒绝,则这个返回的promise就会被拒绝,并且返回或者抛出第一个触发失败的promise对象的错误信息作为它被拒绝的原因。
通常被用于处理多个promise对象的状态集合。
序号 | iterable | 返回 | 备注 |
---|---|---|---|
1 | 空的可迭代对象 ([] 或 “”) |
一个已完成状态的Promise | - |
2 | 不包含任何Promise | 一个异步完成的Promise | Chrome58返回一个已完成状态的Promise |
3 | 其他 | 处理中的Promise | 这个返回的promise之后会在所有的promise都完成变为完成,返回值按参数内的promise顺序排序 or 遇到任一promise失败变为失 |