bfe.dev 是一个针对前端的刷题网站,像是前端的LeetCode。该系列文章是我在下面的刷题日记。
题目33
BFE.dev#33 实现Promise.allSettled()
剖析
和Promise.all()不同,Promise.allSettled()即便是遇到rejection也会期待所有的promise到最初。所以咱们只须要用一个array记录各个promise的fulfill或者reject后果即可。
代码
首先实现根本的new Promise构造。
function allSettled(promises) {
return new Promise((resolve, reject) => {
const result = []
promises.forEach((promise, index) => {
promise.then((value) => {
result[index] = {
status: 'fulfilled',
value
}
}, (reason) => {
result[index] = {
status: 'rejected',
reason
}
})
})
})
}
为了检测最终settle的机会,须要一个计数器。同时也留神传入的数据并不一定全副是Promise。
function allSettled(promises) {
if (promises.length === 0) return Promise.resolve([])
const _promises = promises.map(
item => item instanceof Promise ? item : Promise.resolve(item)
)
return new Promise((resolve, reject) => {
const result = []
let unSettledPromiseCount = _promises.length
_promises.forEach((promise, index) => {
promise.then((value) => {
result[index] = {
status: 'fulfilled',
value
}
unSettledPromiseCount -= 1
// resolve after all are settled
if (unSettledPromiseCount === 0) {
resolve(result)
}
}, (reason) => {
result[index] = {
status: 'rejected',
reason
}
unSettledPromiseCount -= 1
// resolve after all are settled
if (unSettledPromiseCount === 0) {
resolve(result)
}
})
})
})
}
通过撒花
感激浏览,心愿有所帮忙。有趣味能够本人试试。
发表回复