/**
* @param {Array<Function>} functions
* @return {Promise<any>}
*/
var promiseAll = async function(functions) {
};
/**
* const promise = promiseAll([() => new Promise(res => res(42))])
* promise.then(console.log); // [42]
*/
2721. 并行执行异步函数
给定一个异步函数数组 functions
,返回一个新的 promise 对象 promise
。数组中的每个函数都不接受参数并返回一个 promise。
promise
resolve 条件:
functions
返回的 promise 都成功解析时。promise
的解析值应该是一个按照它们在 functions
中的顺序排列的 promise 的解析值数组。promise
reject 条件:
functions
返回的 promise 被拒绝时。promise
也会被拒绝,并返回第一个拒绝的原因。请在不使用内置的 Promise.all
函数的情况下解决。
示例 1:
输入:functions = [ () => new Promise(resolve => setTimeout(() => resolve(5), 200)) ] 输出:{"t": 200, "resolved": [5]} 解释: promiseAll(functions).then(console.log); // [5] 单个函数在 200 毫秒后以值 5 成功解析。
示例 2:
输入:functions = [ () => new Promise(resolve => setTimeout(() => resolve(1), 200)), () => new Promise((resolve, reject) => setTimeout(() => reject("Error"), 100)) ] 输出:{"t": 100, "rejected": "Error"} 解释:由于其中一个 promise 被拒绝,返回的 promise 也在同一时间被拒绝并返回相同的错误。
示例 3:
输入:functions = [ () => new Promise(resolve => setTimeout(() => resolve(4), 50)), () => new Promise(resolve => setTimeout(() => resolve(10), 150)), () => new Promise(resolve => setTimeout(() => resolve(16), 100)) ] 输出:{"t": 150, "resolved": [4, 10, 16]} 解释:所有的 promise 都成功执行。当最后一个 promise 被解析时,返回的 promise 也被解析了。
提示:
functions is an array of functions that returns promises
1 <= functions.length <= 10
原站题解
javascript 解法, 执行用时: 68 ms, 内存消耗: 41.4 MB, 提交时间: 2023-06-10 19:39:22
/** * @param {Array<Function>} functions * @return {Promise<any>} */ var promiseAll = async function(functions) { const results = new Array(functions.length); let count = 0; return new Promise((resolve, reject) => { functions.forEach((fn, i) => { fn().then(result => { results[i] = result; count++; if (count === functions.length) { resolve(results); } }).catch(err => { reject(err); }); }); }); }; /** * const promise = promiseAll([() => new Promise(res => res(42))]) * promise.then(console.log); // [42] */
typescript 解法, 执行用时: 88 ms, 内存消耗: 42.9 MB, 提交时间: 2023-06-10 19:38:30
async function promiseAll<T>(functions: (() => Promise<T>)[]): Promise<T[]> { return new Promise((resolve, reject) => { const resArr = [] let resCount = 0; functions.forEach((fn, i) => { fn().then(res => { resArr[i] = res; if (++resCount == functions.length) { resolve(resArr) } }).catch(reject) }) }) }; /** * const promise = promiseAll([() => new Promise(res => res(42))]) * promise.then(console.log); // [42] */