Promise.any()
描述
参考MDN
developer.mozilla.org/zh-CN/docs/…
Promise.any(iterable);
参数
返回值
- 如果传入了一个空的可迭代对象,那么就会返回一个已经被拒的
promise - 如果传入了一个不含有
promise的可迭代对象,那么就会返回一个异步兑现的promise - 其余情况下都会返回一个处于等待状态的
promise。如果可迭代对象中的任意一个promise兑现了,那么这个处于等待状态的promise就会异步地(调用栈为空时)切换至兑现状态。如果可迭代对象中的所有promise都被拒绝了,那么这个处于等待状态的promise就会异步地切换至被拒状态。
说明
该方法用于获取首个兑现的 promise 的值。只要有一个 promise 兑现了,那么此方法就会提前结束,而不会继续等待其他的 promise 全部敲定。
不像 Promise.all() 会返回一组兑现值那样,我们只能得到一个兑现值(假设至少有一个 promise 兑现)。当我们只需要一个 promise 兑现,而不关心是哪一个兑现时此方法很有用的。
同时,也不像 Promise.race() 总是返回第一个敲定值(兑现或拒绝)那样,这个方法返回的是第一个兑现的值。这个方法将会忽略掉所有的被拒绝的 promise,直到第一个 promise 兑现。
兑现(Fulfillment)
该方法所返回的 promise 会以可迭代对象内首个兑现的 promise 的兑现值来作为它自己的兑现值,或者会以可迭代对象内首个非 promise 值来作为它自己的兑现值,该方法不会关心其他的 promise 是兑现了还是被拒了。
- 如果传入的可迭代对象是非空的,那么当可迭代对象内的任意一个
promise兑现后,或者当可迭代对象内存在非promise值时,该方法所返回的promise都会异步的变成兑现状态。
拒绝(Rejection)
如果可迭代对象内所有的 promises 都被拒绝了,那么该方法所返回的 promise 就会异步的切换至被拒状态,并用一个 AggregateError(继承自 Error)实例来作为它的拒因。它包含一个 errors 属性,该属性是一个用于存储拒因的数组。
- 如果传入了一个空的可迭代数组,那么该方法就会返回一个已经被拒
promise,其拒因是一个AggregateError实例,该实例的errors属性会是一个空数组。
-
手写实现Promise
/** * 1.返回一个Promise, 一旦某一个Promise执行成功,就立即返回, 全部执行失败,才返回reject */ function PromiseAny(array) { //reject 记录 let index = 0 let result = [] return new Promise((resolve, reject) => { for (let i = 0; i < array.length; i++) { let current = array[i]; if (current instanceof Promise) { Promise.resolve(array[i]).then(res => { resolve(res) }).catch(err => { index++; //失败累计加1 result.push(err); if (index === result.length) { reject(result); } }) } else { //立即返回 resolve(current) } } }) } let p1 = Promise.reject('1'); let p2 = Promise.reject("1"); let p3 = Promise.reject("2"); let p4 = Promise.reject("2"); let array = [p1,p2,p3,p4]; PromiseAny(array).then(res=>{ console.log(res); })