MST

星途 面试题库

面试题:JavaScript async/await 在复杂异步流程中的优化与应用

在一个复杂的业务场景中,存在多个异步操作,这些操作有的需要顺序执行,有的需要并发执行,并且有条件判断来决定后续的异步流程。请设计一个基于 async/await 的解决方案,并阐述你在优化异步流程(如减少不必要的等待时间、提高资源利用率等)方面所采取的策略,最后编写完整代码实现该业务场景。
38.6万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

1. 设计思路

  • 顺序执行:使用async/await可以很方便地实现顺序执行,因为await会暂停当前函数的执行,直到被等待的Promise解决。
  • 并发执行:使用Promise.all来并发执行多个异步操作,Promise.all接受一个Promise数组,当所有Promise都解决时,返回一个新的已解决的Promise。
  • 条件判断:在async函数内部使用普通的if - else语句来根据条件决定后续的异步流程。

2. 优化策略

  • 减少不必要的等待时间:对于可以并发执行的异步操作,使用Promise.all并发执行,而不是顺序执行。这样可以充分利用CPU和网络资源,减少总的执行时间。
  • 提高资源利用率:避免在不必要的地方使用await,特别是当某些操作不依赖于其他操作的结果时。同时,合理设置并发操作的数量,防止过多的并发导致资源耗尽。

3. 代码实现

假设我们有三个异步操作asyncOperation1asyncOperation2asyncOperation3asyncOperation1asyncOperation2需要并发执行,之后根据asyncOperation1的结果决定是否执行asyncOperation3

function asyncOperation1() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Result of asyncOperation1');
        }, 1000);
    });
}

function asyncOperation2() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Result of asyncOperation2');
        }, 1500);
    });
}

function asyncOperation3() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Result of asyncOperation3');
        }, 1000);
    });
}

async function main() {
    const [result1, result2] = await Promise.all([asyncOperation1(), asyncOperation2()]);
    console.log('Result of asyncOperation1:', result1);
    console.log('Result of asyncOperation2:', result2);

    if (result1.includes('1')) {
        const result3 = await asyncOperation3();
        console.log('Result of asyncOperation3:', result3);
    }
}

main();

在上述代码中:

  • asyncOperation1asyncOperation2通过Promise.all并发执行。
  • 等待Promise.all完成后,根据asyncOperation1的结果决定是否执行asyncOperation3
  • 通过这种方式,实现了复杂业务场景下异步操作的顺序、并发执行以及条件判断。