LeetCode in Kotlin

2721. Execute Asynchronous Functions in Parallel

Medium

Given an array of asynchronous functions functions, return a new promise promise. Each function in the array accepts no arguments and returns a promise.

promise resolves:

promise rejects:

Please solve it without using the built-in Promise.all function.

Example 1:

Input:

functions = [ 
    () => new Promise(resolve => setTimeout(() => resolve(5), 200)) 
]

Output: {“t”: 200, “resolved”: [5]}

Explanation: promiseAll(functions).then(console.log); // [5] The single function was resolved at 200ms with a value of 5.

Example 2:

Input:

functions = [ 
    () => new Promise(resolve => setTimeout(() => resolve(1), 200)), 
    () => new Promise((resolve, reject) => setTimeout(() => reject("Error"), 100)) 
]

Output: {“t”: 100, “rejected”: “Error”}

Explanation: Since one of the promises rejected, the returned promise also rejected with the same error at the same time.

Example 3:

Input:

functions = [ 
    () => new Promise(resolve => setTimeout(() => resolve(4), 50)), 
    () => new Promise(resolve => setTimeout(() => resolve(10), 150)), 
    () => new Promise(resolve => setTimeout(() => resolve(16), 100)) 
]

Output: {“t”: 150, “resolved”: [4, 10, 16]}

Explanation: All the promises resolved with a value. The returned promise resolved when the last promise resolved.

Constraints:

Solution

async function promiseAll<T>(functions: (() => Promise<T>)[]): Promise<T[]> {
    const resolved = []
    let counter = 0

    return new Promise((resolve, reject) => {
        for (let i = 0; i < functions.length; i++) {
            functions[i]()
                .then((res) => {
                    // must specify index of array
                    resolved[i] = res
                    counter++
                    if (counter === functions.length) {
                        resolve(resolved)
                    }
                })
                .catch((err) => {
                    reject(err)
                })
        }
    })
}

/*
 * const promise = promiseAll([() => new Promise(res => res(42))])
 * promise.then(console.log); // [42]
 */

export { promiseAll }