推荐答案
// www.javascriptcn.com code example
function promiseRace(promises) {
return new Promise((resolve, reject) => {
if (!Array.isArray(promises)) {
return reject(new TypeError('Argument must be an array'));
}
for (const promise of promises) {
Promise.resolve(promise).then(resolve, reject);
}
});
}本题详细解读
1. 函数定义
promiseRace 函数接受一个包含多个 Promise 对象的数组 promises 作为参数。该函数返回一个新的 Promise 对象。
2. 参数校验
在函数内部,首先检查传入的参数是否是一个数组。如果不是数组,则立即拒绝返回的 Promise,并抛出一个 TypeError。
if (!Array.isArray(promises)) {
return reject(new TypeError('Argument must be an array'));
}3. 遍历 Promise 数组
使用 for...of 循环遍历 promises 数组中的每一个 Promise 对象。对于每个 Promise,使用 Promise.resolve 将其转换为一个 Promise 对象(以防传入的不是 Promise),然后调用 then 方法。
for (const promise of promises) {
Promise.resolve(promise).then(resolve, reject);
}4. then 方法的作用
then 方法接收两个回调函数:resolve 和 reject。当任何一个 Promise 完成(无论是成功还是失败)时,resolve 或 reject 就会被调用,从而使得 promiseRace 返回的 Promise 也相应地完成。
5. 返回结果
最终,promiseRace 返回的 Promise 将会是第一个完成的 Promise 的结果(无论是 resolved 还是 rejected)。
6. 使用示例
// www.javascriptcn.com code example
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two');
});
promiseRace([promise1, promise2]).then((value) => {
console.log(value); // 输出 'two'
});在这个示例中,promise2 会先完成,因此 promiseRace 返回的 Promise 会 resolve 为 'two'。