面试题答案
一键面试- 实现思路:
- 使用
Promise.all
来并发执行所有异步任务。Promise.all
接受一个Promise数组,当所有Promise都 resolved 时,它返回的Promise才会 resolved,并且返回值是一个包含所有Promise resolved值的数组。 - 为了避免因某个长时间运行的任务阻塞其他任务的结果获取,我们可以给每个任务都设置一个超时机制。如果某个任务执行时间过长,超过了设定的超时时间,就将其拒绝,这样即使有任务超时,其他任务的结果依然可以获取到。
- 使用
- 关键代码片段:
function timeoutPromise(delay) {
return new Promise((_, reject) => {
setTimeout(() => {
reject(new Error('Task timed out'));
}, delay);
});
}
async function runTasks(tasks, timeout) {
const promises = tasks.map(task => {
return Promise.race([task(), timeoutPromise(timeout)]);
});
try {
const results = await Promise.all(promises);
return results;
} catch (error) {
console.error('One or more tasks failed:', error);
// 这里可以根据需求对失败情况做进一步处理,比如返回部分成功的结果等
}
}
// 示例异步任务
function task1() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Task 1 result');
}, 1000);
});
}
function task2() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Task 2 result');
}, 2000);
});
}
const tasks = [task1, task2];
const timeout = 3000;
runTasks(tasks, timeout).then(results => {
console.log('Results:', results);
});
在上述代码中:
timeoutPromise
函数创建一个在指定时间后被拒绝的Promise。runTasks
函数接受任务数组和超时时间作为参数,使用Promise.race
将每个任务与超时Promise进行竞争,这样如果任务执行时间超过设定的超时时间,就会被拒绝。- 最后使用
Promise.all
并发执行所有任务,并处理可能的错误。