MST

星途 面试题库

面试题:JavaScript async 函数返回值与并发控制及资源释放

假设有多个 async 函数,每个函数模拟对一个外部资源(例如文件描述符,数据库连接等)进行异步操作并返回结果。要求使用 Promise.all 并发执行这些 async 函数,但需要确保无论执行结果如何,所有占用的外部资源都能正确释放(例如关闭文件描述符,断开数据库连接等)。请编写代码实现这一过程,并阐述其中的资源管理思路。
20.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
// 模拟异步操作函数,返回Promise
function asyncOperation1() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('操作1的结果');
        }, 1000);
    });
}

function asyncOperation2() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('操作2的结果');
        }, 1500);
    });
}

// 模拟释放资源的函数
function releaseResource1() {
    console.log('释放资源1');
}

function releaseResource2() {
    console.log('释放资源2');
}

// 执行异步操作并管理资源
function executeWithResourceManagement() {
    const operations = [
        {
            asyncFn: asyncOperation1,
            releaseFn: releaseResource1
        },
        {
            asyncFn: asyncOperation2,
            releaseFn: releaseResource2
        }
    ];

    const promises = operations.map(op => {
        return new Promise((resolve, reject) => {
            op.asyncFn()
              .then(result => {
                    resolve(result);
                })
              .catch(err => {
                    reject(err);
                })
              .finally(() => {
                    op.releaseFn();
                });
        });
    });

    return Promise.all(promises);
}

// 调用执行函数
executeWithResourceManagement()
  .then(results => {
        console.log('所有操作结果:', results);
    })
  .catch(err => {
        console.log('出现错误:', err);
    });

资源管理思路

  1. 封装资源操作与释放:将每个异步操作函数及其对应的资源释放函数封装在一个对象中,方便管理。
  2. Promise包装:对每个异步操作函数使用 Promise 进行包装,在 finally 块中调用资源释放函数,确保无论操作成功或失败,资源都能被释放。
  3. Promise.all 并发执行:将所有包装后的 Promise 放入 Promise.all 中,实现并发执行多个异步操作,并等待所有操作完成或有一个操作失败。这样可以确保所有资源都能在操作结束后正确释放,同时也能并发获取多个异步操作的结果。