代码示例
function asyncTaskSystem() {
let sharedState = 0;
const taskQueue = [];
function addTask(task) {
taskQueue.push(task);
}
function runTasks() {
let currentIndex = 0;
function executeNext() {
if (currentIndex < taskQueue.length) {
const task = taskQueue[currentIndex];
currentIndex++;
task(sharedState, (newState) => {
sharedState = newState;
executeNext();
});
}
}
executeNext();
}
return {
addTask,
runTasks
};
}
// 使用示例
const system = asyncTaskSystem();
system.addTask((state, callback) => {
setTimeout(() => {
const newState = state + 1;
console.log('Task 1 updated state:', newState);
callback(newState);
}, 1000);
});
system.addTask((state, callback) => {
setTimeout(() => {
const newState = state * 2;
console.log('Task 2 updated state:', newState);
callback(newState);
}, 1500);
});
system.runTasks();
设计思路
- 闭包管理共享状态:在
asyncTaskSystem
函数内部定义了 sharedState
和 taskQueue
,这些变量被包含在 addTask
和 runTasks
函数形成的闭包中。因此,addTask
和 runTasks
可以访问和修改 sharedState
,实现了共享状态的管理。
- 任务队列:
taskQueue
用于存储所有要执行的异步任务。addTask
函数负责将任务添加到队列中。
- 顺序执行任务:
runTasks
函数通过递归调用 executeNext
来顺序执行任务队列中的任务。每次执行一个任务时,任务会接收当前的 sharedState
,并且在任务完成后通过回调函数更新 sharedState
,从而保证数据的一致性和正确性。这样,每个任务都是基于前一个任务执行完毕后的状态进行操作,避免了并发操作可能导致的数据不一致问题。