Promise 对象用于表示一个异步操作的最终状态(完成或失败),以及其返回的值。大多数人都在使用由其他函数创建并返回的
promise对象是由关键字 new 及其构造函数来创建的。该构造函数会?把一个叫做“处理器函数”(executor function)的函数作为它的参数。这个“处理器函数”接受两个函数——resolve 和 reject ——作为其参数。当异步任务顺利完成且返回结果值时,会调用 resolve 函数;而当异步任务失败且返回失败原因(通常是一个错误对象)时,会调用reject 函数。
语法
new Promise( function(resolve, reject) {...} /* executor */ );
参数
executor
executor是带有 resolve 和 reject 两个参数的函数 。Promise构造函数执行时立即调用executor 函数, resolve 和 reject 两个函数作为参数传递给executor(executor 函数在Promise构造函数返回新建对象前被调用)。resolve 和 reject 函数被调用时,分别将promise的状态改为fulfilled(完成)或rejected(失败)。executor 内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled,或者在发生错误时将它的状态改为rejected。
如果在executor函数中抛出一个错误,那么该promise 状态为rejected。executor函数的返回值被忽略。
流程
Promise有以下几种状态:
pending: 初始状态,既不是成功,也不是失败状态。
fulfilled: 意味着操作成功完成。 调用resolve方法传递值到then方法调用promise的then里面的onFullfillment()
rejected: 意味着操作失败。 调用reject方法传递值到then方法调用promise的then里面的onReject();或者调用promise的catch()
方法
Promise.prototype.then(onFulfilled, onRejected):添加一个拒绝(rejection) 回调到当前 promise, 返回一个新的promise。
Promise.prototype.catch(onRejected);
Promise.prototype.finally(onFinally)
1)、Promise.prototype.then(onFulfilled,onRejected);
处理Promise状态变为rejected或fulfilled
最多需要有两个参数:Promise 的成功和失败情况的回调函数。
如果忽略针对某个状态的回调函数参数,这个新 Promise 只是简单地接受调用这个 then 的原 Promise的终态作为它的终态。
如果传入的参数不是函数
,则会在内部被替换为(x) => x
,即原样返回 promise 最终结果的函数。
参数:onFulfilled回调函数的参数为(the fulfillment value),onRejected 回调函数的参数为(the rejection reason)。
返回值:返回一个Promise,而它的行为与then中的回调函数的返回值有关。
1、then的回调函数返回一个值
,then返回一个完成状态
的Promise;
2、then的回调函数抛出一个错误
,then返回一个拒绝状态
的Promise
3、then的回调函数返回一个已完成或已拒绝Promise
,then返回一个相同状态和值
的Promise;
4、then的回调函数返回一个Pending的Pormise
,then返回一个状态,完成和拒绝回调函数一样
的Promise
2)、Promise.prototype.catch(onRejected)
方法返回一个Promise,并且处理拒绝的情况。 在resolve()后面抛出的错误会被忽略
事实上, calling obj.catch(onRejected) 内部calls obj.then(undefined, onRejected)
参数:onRejected 回调函数的参数为(the rejection reason)。
返回值:返回一个Promise,回调函数onRejected 抛出一个错误或返回一个本身失败的 Promise , 返回的rejected
的Promise;否则,返回完成状态
的Promise;
3)、Promise.prototype.finally()
: 方法返回一个Promise,在执行then()和catch()后,都会执行finally指定的回调函数
。避免同样的语句需要在then()和catch()中各写一次的情况。回调函数无入参
,返回的新Promise默认返回当前Promise的(the fulfillment value)或(the rejection reason)。
与Promise.resolve(2).then(() => {}, () => {}) (回调函数返回undefined)(resolved的结果为undefined)不同,Promise.resolve(2).finally(() => {}) resolved的结果为 2。
同样,Promise.reject(3).then(() => {}, () => {})(回调函数返回undefined) (resolved 的结果为undefined), Promise.reject(3).finally(() => {}) rejected 的结果为 3。
finally的回调函数抛出错误或返回rejected状态的Promise,finally将返回一个rejected的Promise.
4)、Promise.all(iterable)
参数:一个可迭代对象,如 Array 或 String。
返回值:
1、如果传入的参数是一个空的可迭代对象或无任何Promise对象
,返回已完成(already resolved
)状态的 Promise。空可迭代对象同步返回
。
2、其他情况,异步返回
一个处理中(pending
)的Promise。
all返回的Promise完成状态的结果都是一个数组
,它包含所有的传入迭代参数对象的值(也包括非 promise 值)。有一个Promise失败的时候,失败的那个结果给失败状态的回调函数,而不管其它 promise 是否完成。
5)、Promise.race(iterable)
方法返回一个 pending
promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。
参数:一个可迭代对象,如 Array 或 String。
返回值:如果传的迭代是空的
,则返回的 promise 将永远等待
;如果迭代包含一个或多个Promise和/或已解决/拒绝的Promise,则 Promise.race 将解析为迭代中找到的第一个值。
6)、Promise.reject(reason)
方法返回一个带有拒绝原因reason参数的Promise对象。
7)、Promise.resolve(value)
方法返回一个以给定值解析后的Promise 对象。
参数:Promise对象解析的参数。也可以是一个Promise对象,或者是一个thenable。
返回值:一个解析过带着给定值的Promise对象,如果返回值是一个promise对象,则直接返回这个Promise对象。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。