3-6 实现一个 Promise.allSettled 方法



/**
 * 实现一个 Promise.allSettled 方法
 * @param {*} list 
 * @returns [ { status: 'fulfilled'| 'rejected', value(fulfilled) | reason(rejected)  } ]
 */


function myPromiseAllSettled(list) {
    const result = [];
    let count = 0;
    return new Promise((reslove, reject) => {
        list.forEach((promise, index) => {
            promise.then((res) => {
                const succeed = {
                    status: 'fulfilled',
                    value: res
                }
                result[index] = succeed;
                count++;
            },(err)=> {
                const error = {
                    status: 'rejected',
                    reason: err
                }
                result[index] = error;
                count++;
            })
            .finally(() => {
                if(count >= list.length) {
                    reslove(result)
                }
            })
            
           
        })
        
    })
}


// test
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'));
const promises = [promise1, promise2];

myPromiseAllSettled(promises).
  then((results) => results.forEach((result) => console.log(result)));

相关