bfe.dev 是一个针对前端的刷题网站,像是前端的LeetCode。该系列文章是我在上面的刷题日记。
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) } }) }) }) } 复制代码
感谢阅读,希望有所帮助。有兴趣可以自己试试。
原创声明,本文系作者授权云+社区发表,未经许可,不得转载。
如有侵权,请联系 yunjia_community@tencent.com 删除。
我来说两句