列表

详情


2721. 并行执行异步函数

给定一个异步函数数组 functions,返回一个新的 promise 对象 promise。数组中的每个函数都不接受参数并返回一个 promise。

promise resolve 条件:

promise reject 条件:

请在不使用内置的 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 也被解析了。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
/** * @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] */

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]
 */

上一题