1. /**
    2. * @param {Array<any>} promises - notice that input might contains non-promises
    3. * @return {Promise<Array<{status: 'fulfilled', value: any} | {status: 'rejected', reason: any}>>}
    4. */
    5. function allSettled(promises) {
    6. if (promises.length === 0) {
    7. return Promise.resolve([])
    8. }
    9. const results = []
    10. let completed = 0
    11. return new Promise((resolve) => {
    12. for (let i = 0; i< promises.length; i++) {
    13. Promise.resolve(promises[i])
    14. .then(value => {
    15. results[i] = { status: 'fulfilled', value }
    16. })
    17. .catch(reason => {
    18. results[i] = { status: 'rejected', reason }
    19. })
    20. .finally(() => {
    21. completed++
    22. if (completed === promises.length) {
    23. resolve(results)
    24. }
    25. })
    26. }
    27. })
    28. }
    function allSettled(promises) {
        // Using promise all
        return Promise.all(promises.map(p => Promise.resolve(p).then((value) => {
            return {
                status: 'fulfilled',
                value
            };
        }, (reason) => {
            return {
                status: 'rejected',
                reason
            };
        })));
    }