MST

星途 面试题库

面试题:Flutter中async/await并发操作的性能优化

假设你有一组数量不确定的异步任务需要并发执行,并且每个任务的执行时间不同,在使用async/await实现时,如何避免因某个长时间运行的任务阻塞其他任务的结果获取,同时优化整体的执行性能?请给出具体的实现思路和关键代码片段。
36.7万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 使用Promise.all来并发执行所有异步任务。Promise.all接受一个Promise数组,当所有Promise都 resolved 时,它返回的Promise才会 resolved,并且返回值是一个包含所有Promise resolved值的数组。
    • 为了避免因某个长时间运行的任务阻塞其他任务的结果获取,我们可以给每个任务都设置一个超时机制。如果某个任务执行时间过长,超过了设定的超时时间,就将其拒绝,这样即使有任务超时,其他任务的结果依然可以获取到。
  2. 关键代码片段
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并发执行所有任务,并处理可能的错误。