<script type="text/javascript">
class PromiseQueue {
constructor() {
this.queue = [];
this.paused = false;
}
addTask(task) {
return new Promise((resolve, reject) => {
const wrapper = () => {
if (this.paused) {
this.queue.push(wrapper);
} else {
task().then(resolve).catch(reject);
}
};
this.queue.push(wrapper);
if (this.queue.length === 1) {
wrapper();
}
});
}
start() {
this.paused = false;
const next = () => {
if (this.queue.length > 0) {
const task = this.queue.shift();
task();
}
};
next();
}
pause() {
this.paused = true;
}
resume() {
this.paused = false;
}
}
const queue = new PromiseQueue();
const task1 = () => new Promise((resolve) => setTimeout(() => {
console.log('Task 1');
resolve();
}, 1000));
const task2 = () => new Promise((resolve) => setTimeout(() => {
console.log('Task 2');
resolve();
}, 2000));
queue.addTask(task1).then(() => console.log('Task 1 completed'));
queue.addTask(task2).then(() => console.log('Task 2 completed'));
queue.start();
setTimeout(() => {
queue.pause();
console.log('Queue paused');
}, 1500);
setTimeout(() => {
queue.start();
console.log('Queue started');
}, 4000);
setTimeout(() => {
queue.resume();
console.log('Queue resume');
}, 5000);
</script> 网友回复


