前言:锻炼自己的思想,规范自己的编程思路。
问题:
给定一个异步函数数组 functions,返回一个新的 promise 对象 promise。数组中的每个函数都不接受参数并返回一个 promise。
promise resolve 条件:
当所有从 functions 返回的 promise 都成功解析时。promise 的解析值应该是一个按照它们在 functions 中的顺序排列的 promise 的解析值数组。 promise reject 条件:
当任何从 functions 返回的 promise 被拒绝时。promise 也会被拒绝,并返回第一个拒绝的原因。 请在不使用内置的 Promise.all 函数的情况下解决。
示例:
输入:functions = [
() => new Promise(resolve => setTimeout(() => resolve(5), 200))
]
输出:{"t": 200, "resolved": [5]}
解释:
promiseAll(functions).then(console.log); // [5]
单个函数在 200 毫秒后以值 5 成功解析。
思路:
promiseAll 的函数,接接收一个异步函数数组 functions 作为参数,并返回一个新的promise 对象。
在函数内部,首先声明了一个空数组results和一个计数器变量completed。然后使用forEach 方法遍历 functions 数组中的每个函数。对于每个函数,我们调用它并使用 then 和catch 方法来处理返回的 promise 对象。
如果返回的promise 对象成功解析,我们将其解析值存储在结果数组results 中,并将计数器变量 completed 加一。当所有返回的promise 对象都成功解析时(即当计数器变量completed 等于functions 数组的长度时),我们使用 resolve 函数来解析新的promise 对象,并将结果数组作为解析值。
如果任何返回的 promise 对象被拒绝,我们使用catch 方法捕获错误并使用 reject 函数来拒绝新的 promise 对象,并返回第一个拒绝的原因。
总之,这个函数实现了类似于内置的 Promise.all 函数的功能,它接受一个异步函数数组作为参数,并返回一个新的promise 对象,该对象在所有输入函数返回的promise 对象都成功解析时解析,并在任何输入函数返回的 promise 对象被拒绝时拒绝。
基于上述思考,代码如下:
/**
* @param {Array<Function>} functions
* @return {Promise<any>}
*/
var promiseAll = async function(functions) {
return new Promise((resolve, reject) => {
let results = [];
let completed = 0;
functions.forEach((func, index) => {
func().then(result => {
results[index] = result;
completed += 1;
if (completed === functions.length) {
resolve(results);
}
}).catch(error => {
reject(error);
});
});
});
}
执行结果如下图: