MST

星途 面试题库

面试题:JavaScript中如何利用闭包实现基于类对象的简单并发控制

请简述在JavaScript里,怎样通过闭包的特性来实现基于类对象对并发任务的初步控制,例如在一个类中,有多个异步任务需要按顺序执行,使用闭包来处理,给出简单代码示例及解释。
22.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 闭包的概念:闭包是指有权访问另一个函数作用域中变量的函数。在JavaScript中,当内部函数在外部函数返回后仍然存在时,就形成了闭包,内部函数可以访问外部函数的变量。
  2. 实现基于类对象对并发任务的初步控制(按顺序执行异步任务)
    • 以下是使用闭包实现类中异步任务按顺序执行的代码示例:
class TaskManager {
    constructor() {
        this.tasks = [];
    }
    addTask(task) {
        this.tasks.push(task);
    }
    executeTasks() {
        let index = 0;
        const executeNext = () => {
            if (index < this.tasks.length) {
                const task = this.tasks[index];
                task().then(() => {
                    index++;
                    executeNext();
                });
            }
        };
        executeNext();
    }
}

// 使用示例
const manager = new TaskManager();
manager.addTask(() => new Promise((resolve) => {
    setTimeout(() => {
        console.log('Task 1 completed');
        resolve();
    }, 1000);
}));
manager.addTask(() => new Promise((resolve) => {
    setTimeout(() => {
        console.log('Task 2 completed');
        resolve();
    }, 1500);
}));
manager.executeTasks();
  1. 代码解释
    • 类的定义
      • TaskManager类有一个构造函数,用于初始化一个tasks数组,这个数组将用于存储所有要执行的异步任务。
      • addTask方法用于向tasks数组中添加任务。每个任务应该是一个返回Promise的函数。
    • 任务执行逻辑
      • executeTasks方法是核心部分。它使用闭包来按顺序执行任务。
      • 定义了一个index变量,用于跟踪当前执行到哪个任务。
      • executeNext函数是一个闭包,它可以访问indextasks变量。在executeNext函数中,首先检查index是否小于tasks的长度。如果是,则取出当前任务并执行。任务执行完毕(Promiseresolve)后,index自增,然后递归调用executeNext来执行下一个任务。
    • 使用示例
      • 创建一个TaskManager实例manager
      • 使用addTask方法添加两个异步任务,每个任务使用setTimeout模拟异步操作,并在完成时resolve Promise
      • 调用executeTasks方法启动任务的顺序执行。