- 闭包的概念:闭包是指有权访问另一个函数作用域中变量的函数。在JavaScript中,当内部函数在外部函数返回后仍然存在时,就形成了闭包,内部函数可以访问外部函数的变量。
- 实现基于类对象对并发任务的初步控制(按顺序执行异步任务):
- 以下是使用闭包实现类中异步任务按顺序执行的代码示例:
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();
- 代码解释:
- 类的定义:
TaskManager
类有一个构造函数,用于初始化一个tasks
数组,这个数组将用于存储所有要执行的异步任务。
addTask
方法用于向tasks
数组中添加任务。每个任务应该是一个返回Promise
的函数。
- 任务执行逻辑:
executeTasks
方法是核心部分。它使用闭包来按顺序执行任务。
- 定义了一个
index
变量,用于跟踪当前执行到哪个任务。
executeNext
函数是一个闭包,它可以访问index
和tasks
变量。在executeNext
函数中,首先检查index
是否小于tasks
的长度。如果是,则取出当前任务并执行。任务执行完毕(Promise
被resolve
)后,index
自增,然后递归调用executeNext
来执行下一个任务。
- 使用示例:
- 创建一个
TaskManager
实例manager
。
- 使用
addTask
方法添加两个异步任务,每个任务使用setTimeout
模拟异步操作,并在完成时resolve
Promise
。
- 调用
executeTasks
方法启动任务的顺序执行。