并行执行异步函数


1.题目描述

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

promise resolve 条件:

当所有从 functions 返回的 promise 都成功解析时。promise 的解析值应该是一个按照它们在 functions 中的顺序排列的 promise 的解析值数组。
promise reject 条件:

当任何从 functions 返回的 promise 被拒绝时。promise 也会被拒绝,并返回第一个拒绝的原因。
请在不使用内置的 Promise.all 函数的情况下解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var promiseAll = async function (functions) {
return new Promise((resolve, reject) => {
// 已成功的数量
let resolveCount = 0;
// 待处理的 promises 数组的长度,此处为传入的参数 functions
const promisesLength = functions.length;
// 准备一个保存成功值的数组
const values = new Array(promisesLength);
// 遍历每个待处理的 promise
for (let i = 0; i < promisesLength; i++) {
// 注意 functions[i] 是异步函数 执行函数后才返回 promise 对象 故此处为 functions[i]()
functions[i]().then(
(value) => {
// 保存当前 promise 成功的值到对应的下标
values[i] = value;
// 成功的数量加 1
resolveCount++;
// 一旦全部成功
if (resolveCount === promisesLength) {
// 将所有成功值的数组作为返回 promise 对象的成功结果值
resolve(values);
}
},
(reason) => {
// 一旦有一个 promise 产生了失败结果值,将其作为返回 promises 对象的失败结果值
reject(reason);
}
);
}
});
};