Promise
Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值。
描述
异步方法并不会立即返回最终的值,而是会返回一个 promise,以便在未来某个时候把值交给使用者。
一个 Promise
必然处于以下几种状态之一:
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作成功完成。
- 已拒绝(rejected): 意味着操作失败。
因为 Promise.prototype.then
和 Promise.prototype.catch
方法返回的是 promise, 所以它们可以被链式调用。
方法
Promise.resolve()
1 | Promise.resolve(value); |
描述
静态方法 Promise.resolve
返回一个解析过的Promise
对象。
参数
value
将被Promise
对象解析的参数,也可以是一个Promise
对象,或者是一个thenable。
返回值
返回一个带着给定值解析过的Promise
对象,如果参数本身就是一个Promise
对象,则直接返回这个Promise
对象。
示例
使用静态Promise.resolve方法
1 | Promise.resolve("Success").then(function(value) { |
resolve一个数组
1 | var p = Promise.resolve([1,2,3]); |
resolve另一个promise
1 | var original = Promise.resolve(33); |
resolve thenable 并抛出错误
1 | // Resolve一个thenable对象 |
Promise.reject()
1 | Promise.reject(reason); |
描述
静态函数Promise.reject
返回一个被拒绝的Promise对象
。通过使用Error
的实例获取错误原因reason
对调试和选择性错误捕捉很有帮助。
参数
reason
表示Promise
被拒绝的原因。
返回值
一个给定原因了的被拒绝的 Promise
。
示例
使用静态Promise.reject()方法
1 | Promise.reject(new Error('fail')).then(function() { |
Promise.prototype.then()
1 | p.then(onFulfilled[, onRejected]); |
描述
由于 then
和 Promise.prototype.catch()
方法都会返回 promise,它们可以被链式调用——这同时也是一种被称为复合( composition) 的操作。
参数
onFulfilled
可选
当 Promise 变成接受状态(fulfilled)时调用的函数
。该函数有一个参数,即接受的最终结果(the fulfillment value)。如果该参数不是函数,则会在内部被替换为 (x) => x
,即原样返回 promise 最终结果的函数
onRejected
可选
当 Promise 变成拒绝状态(rejected)时调用的函数
。该函数有一个参数,即拒绝的原因(rejection reason
)。 如果该参数不是函数,则会在内部被替换为一个 “Thrower” 函数 (it throws an error it received as argument)。
返回值
当一个 Promise
完成(fulfilled)或者失败(rejected)时,返回函数将被异步调用(由当前的线程循环来调度完成)。具体的返回值依据以下规则返回。如果 then
中的回调函数:
- 返回了一个值,那么
then
返回的 Promise 将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。 - 没有返回任何值,那么
then
返回的 Promise 将会成为接受状态,并且该接受状态的回调函数的参数值为undefined
。 - 抛出一个错误,那么
then
返回的 Promise 将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。 - 返回一个已经是接受状态的 Promise,那么
then
返回的 Promise 也会成为接受状态,并且将那个 Promise 的接受状态的回调函数的参数值作为该被返回的Promise的接受状态回调函数的参数值。 - 返回一个已经是拒绝状态的 Promise,那么
then
返回的 Promise 也会成为拒绝状态,并且将那个 Promise 的拒绝状态的回调函数的参数值作为该被返回的Promise的拒绝状态回调函数的参数值。 - 返回一个未定状态(
pending
)的 Promise,那么then
返回 Promise 的状态也是未定的,并且它的终态与那个 Promise 的终态相同;同时,它变为终态时调用的回调函数参数与那个 Promise 变为终态时的回调函数的参数是相同的。
示例
使用then
方法
1 | var p1 = new Promise((resolve, reject) => { |
链式调用
then
方法返回一个 Promise
对象,其允许方法链。
1 | Promise.resolve("foo") |
Promise.prototype.catch()
1 | p.catch(onRejected); |
描述
catch
方法可以用于您的promise组合中的错误处理。
参数
onRejected
当Promise 被rejected时,被调用的一个Function
。 该函数拥有一个参数:reason
rejection 的原因。如果 onRejected
抛出一个错误或返回一个本身失败的 Promise , 通过 catch()
返回的Promise 被rejected;否则,它将显示为成功(resolved)。
返回值
一个Promise
。
示例
捕获抛出的错误
1 | // 抛出一个错误,大多数时候将调用catch方法 |
如果已决议
1 | //创建一个新的 Promise ,且已决议 |
Promise.all()
1 | Promise.all(iterable); |
描述
此方法在集合多个 promise
的返回结果时很有用。
完成(Fulfillment):
如果传入的可迭代对象为空,Promise.all
会同步地返回一个已完成(resolved)状态的promise
。
如果所有传入的promise
都变为完成状态,或者传入的可迭代对象内没有promise
,Promise.all
返回的promise
异步地变为完成。
在任何情况下,Promise.all
返回的promise
的完成状态的结果都是一个数组,它包含所有的传入迭代参数对象的值(也包括非promise
值)。失败/拒绝(Rejection):
如果传入的promise
中有一个失败(rejected),Promise.all
异步地将失败的那个结果给失败状态的回调函数,而不管其它promise
是否完成。
参数
iterable
返回值
- 如果传入的参数是一个空的可迭代对象,则返回一个已完成(already resolved)状态的
Promise
。 - 如果传入的参数不包含任何
promise
,则返回一个异步完成(asynchronously resolved)Promise
。注意:Google Chrome 58 在这种情况下返回一个已完成(already resolved)状态的Promise
。 - 其它情况下返回一个处理中(pending)的
Promise
。这个返回的promise
之后会在所有的promise
都完成或有一个promise
失败时异步地变为完成或失败。 见下方关于“Promise.all 的异步或同步”示例。返回值将会按照参数内的promise
顺序排列,而不是由调用promise
的完成顺序决定。
示例
Promise.all 的使用
1 | var p1 = Promise.resolve(3); |
Promise.all 的异步和同步
1 | // we are passing as argument an array of promises that are already resolved, |
如果 Promise.all
失败,也是一样的:
1 | var mixedPromisesArray = [Promise.resolve(33), Promise.reject(44)]; |
但是,Promise.all
当且仅当传入的可迭代对象为空时为同步:
1 | var p = Promise.all([]); // will be immediately resolved |
Promise.any()
1 | Promise.any(iterable); |
描述
这个方法用于返回第一个成功的 promise
。只要有一个 promise
成功此方法就会终止,它不会等待其他的 promise
全部完成。
不像 Promise.all() 会返回一组完成值那样(resolved values),我们只能得到一个成功值(假设至少有一个 promise
完成)。当我们只需要一个 promise
成功,而不关心是哪一个成功时此方法很有用的。
同时, 也不像 Promise.race() 总是返回第一个结果值(resolved/reject)那样,这个方法返回的是第一个 成功的 值。这个方法将会忽略掉所有被拒绝的 promise
,直到第一个 promise
成功。
参数
iterable
返回值
- 如果传入的参数是一个空的可迭代对象,则返回一个 已失败(already rejected) 状态的 Promise。
- 如果传入的参数不包含任何
promise
,则返回一个 异步完成 (asynchronously resolved)的 Promise。 - 其他情况下都会返回一个处理中(pending) 的 Promise。 只要传入的迭代对象中的任何一个
promise
变成成功(resolve)状态,或者其中的所有的promises
都失败,那么返回的promise
就会 异步地(当调用栈为空时) 变成成功/失败(resolved/reject)状态。
示例
1 | const pErr = new Promise((resolve, reject) => { |
显示第一张已加载的图片
1 | function fetchAndDecode(url) { |
Promise.race()
1 | Promise.race(iterable); |
描述
race
函数返回一个 Promise
,它将与第一个传递的 promise 相同的完成方式被完成。它可以是完成( resolves),也可以是失败(rejects),这要取决于第一个完成的方式是两个中的哪个。
如果传的迭代是空的,则返回的 promise 将永远等待。
如果迭代包含一个或多个非承诺值和/或已解决/拒绝的承诺,则 Promise.race
将解析为迭代中找到的第一个值。
参数
iterable
返回值
一个待定的 Promise
只要给定的迭代中的一个promise解决或拒绝,就采用第一个promise的值作为它的值,从而异步地解析或拒绝(一旦堆栈为空)。
示例
1 | // we are passing as argument an array of promises that are already resolved, |