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) } }) }) })}
通过撒花
感激浏览,心愿有所帮忙。有趣味能够本人试试。