队列
class Chaos {
constructor() {
this.tasks = []
const fn = () => {
console.log('chain start')
this.next()
}
this.tasks.push(fn)
}
start() {
Promise.resolve().then(() => {
this.next()
})
return this
}
next() {
const fn = this.tasks.shift();
fn && fn()
}
sleep(n) {
const fn = () => {
console.log('sleep start')
setTimeout(() => {
console.log('sleep end')
this.next()
}, n * 1000)
}
this.tasks.push(fn)
return this
}
work() {
const fn = () => {
console.log('work')
this.next()
}
this.tasks.push(fn)
return this
}
eat() {
const fn = () => {
console.log('eat')
this.next()
}
this.tasks.push(fn)
return this
}
}
const chain = () => {
return new Chaos().start()
}
chain().eat().sleep(5).work().eat().work().sleep(10)
Promise
class Chains {
task = Promise.resolve()
eat() {
this.task = this.task.then(() => {
console.log('eat')
})
return this
}
work() {
this.task = this.task.then(() => {
console.log('work')
})
return this
}
sleep(n) {
this.task = this.task.then(() => {
console.log('sleep start')
return new Promise((resolve) => {
setTimeout(() => {
console.log('sleep end')
resolve()
}, n * 1000)
})
})
return this
}
}
const chain = () => new Chains()
chain().eat().sleep(5).work().eat().work().sleep(10)