Promise 的方法功能不用多说,既然你看到了这篇文章,也就多多少少知道它的使用方式了。 直接上代码:
resolve
function promiseResolve(arg) {
return new Promise(resolve => resolve(arg))
}
reject
function promiseResolve(arg) {
return new Promise((resolve, reject) => reject(arg))
}
all
function promiseAll(promiseArr) {
const values = []
return new Promise((resolve, reject) => {
const length = promiseArr.length
let count = 0
for (let i = 0; i < length; i++) {
// 如果不是promise ,转换成promise
let promise = promiseArr[i]
if (!(promise instanceof Promise)) {
promise = Promise.resolve(promise)
}
promise.then(res => {
count ++
values[i] = res
if (count >= length) {
resolve(values)
}
}, err => {
reject(err)
})
}
})
}
allSettled
function promiseAllSettled(promiseArr) {
const values = []
return new Promise((resolve, reject) => {
const length = promiseArr.length
let count = 0
for (let i = 0; i < length; i++) {
// 如果不是promise ,转换成promise
let promise = promiseArr[i]
if (!(promise instanceof Promise)) {
promise = Promise.resolve(promise)
}
promise.then(res => {
count++
values[i] = { status: 'fulfilled', value: res }
if (count >= length) {
resolve(values)
}
}).catch(err => {
count++
values[i] = { status: 'rejected', reason: err }
if (count >= length) {
resolve(values)
}
})
}
})
}
race
function promiseRace(promiseArr) {
return new Promise((resolve, reject) => {
const length = promiseArr.length
let count = 0
for (let i = 0; i < length; i++) {
// 如果不是promise ,转换成promise
let promise = promiseArr[i]
if (!(promise instanceof Promise)) {
promise = Promise.resolve(promise)
}
promise.then(res => {
resolve(res)
}).catch(err => {
reject(err)
})
}
})
}
any
function promiseAny(promiseArr) {
const errValues = []
return new Promise((resolve, reject) => {
const length = promiseArr.length
let count = 0
for (let i = 0; i < length; i++) {
// 如果不是promise ,转换成promise
let promise = promiseArr[i]
if (!(promise instanceof Promise)) {
promise = Promise.resolve(promise)
}
promise.then(res => {
// 只要有一个成功,直接返回
resolve(res)
}, err => {
// 如果都失败了
errValues.push(err)
if (errValues.length === length) {
reject('AggregateError: All promises were rejected')
}
})
}
})
}
测试代码:
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(111)
}, 2000)
})
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(222)
}, 1000)
})
const p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(333)
}, 3000)
})
// 最后一个成员是非promise,这种也需要考虑
promiseAll([p1, p2, p3, 44444]).then(res => {
console.log('success: ', res)
}).catch(err => {
console.log('err: ', err)
})
希望对 viewers 有所帮助,期待您的留言。