Promise.all()
要领接收一个包括 Promise 对象或一般值的数组(或其它可迭代对象)作为参数,并返回一个 Promise。当一切 Promise 对象都 resolve 后,将一切 resolve 值以数组情势作为 Promise.all()
resolve 的效果。假如个中之一的 Promise 被 reject,马上以第一个 reject 的值作为 Promise.all()
reject 效果。
在现实运用中,假如须要从几个接口猎取数据,而且要在一切数据抵达后才实行某些操纵,就能够运用Promise.all()
。
const p1 = new Promise(function (resolve) { setTimeout(resolve, 200, 1) })
const p2 = Promise.resolve(2)
const p3 = 3
Promise.all([p1, p2, p3]).then(function (res) { console.log(res) }) // [1,2,3]
以下是代码完成,须要一个计数器,来确认一切 promise 对象都已 resolved,今后返回效果。须要一个数组,按递次纪录返回效果。假如运用相似 for (var i = 0; i < iterable[i]; i++)
的体式格局遍历,为防止闭包只能传入变量援用的题目,须要嵌套一层自实行函数。这里运用 for ... in
轮回,使函数能够支撑除数组外的其它可迭代对象,如数据结构 Set。
const all = function (iterable) {
return new Promise(function (resolve, reject) {
let count = 0, ans = new Array(count)
for (const i in iterable) {
const v = iterable[i]
if (typeof v === 'object' && typeof v.then === 'function') {
v.then(function (res) {
ans[i] = res
if (--count === 0) resolve(ans)
}, reject)
count++
} else {
ans[i] = v
}
}
})
}
const p1 = new Promise(function (resolve) { setTimeout(resolve, 200, 1) })
const p2 = Promise.resolve(2)
const p3 = 3
all([p1, p2, p3]).then(function (res) { console.log(res) }) // [1,2,3]
同 Promise.all()
,Promise.race()
要领接收一个包括 Promise 对象或一般值的数组(或其它可迭代对象)作为参数,并返回一个 Promise。一旦个中之一的 Promise 对象 resolve 今后,马上把 resolve 的值作为 Promise.race()
resolve 的效果。假如个中之一的对象 reject,Promise.race
也会马上 reject。
在现实运用中,假如能够从几个接口猎取雷同的数据,哪一个接口数据先到就先用哪一个,就能够运用Promise.race()
,所需时候即是个中最快的谁人接口。下面是代码:
const race = function (iterable) {
return new Promise(function (resolve, reject) {
for (const i in iterable) {
const v = iterable[i]
if (typeof v === 'object' && typeof v.then === 'function') {
v.then(resolve, reject)
} else {
resolve(v)
}
}
})
}
const p1 = new Promise(function (resolve) { setTimeout(resolve, 200, 1) })
const p2 = new Promise(function (resolve) { setTimeout(resolve, 100, 2) })
race([p1, p2]).then(function (res) { console.log(res) }) // 2