Skip to content

Instantly share code, notes, and snippets.

@MarvinXu
Created March 31, 2022 13:52
Show Gist options
  • Save MarvinXu/0b9bb11d0e10a1b7e10638ab4cf0b015 to your computer and use it in GitHub Desktop.
Save MarvinXu/0b9bb11d0e10a1b7e10638ab4cf0b015 to your computer and use it in GitHub Desktop.
Method chaining & task queue
class LazyManClass {
constructor(name) {
this.name = name
this.tasks = []
setTimeout(() => {
this.flush()
})
}
flush() {
let seq = Promise.resolve()
while(this.tasks.length) {
const task = this.tasks.shift()
seq = seq.then(task)
}
}
appendTask(task) {
this.tasks.push(task)
return this
}
prependTask(task) {
this.tasks.unshift(task)
return this
}
sleep(time) {
return this.appendTask(() => {
console.log(`sleeping for ${time}ms`)
return delay(time)
})
}
sleepFirst(time) {
return this.prependTask(() => {
console.log(`sleeping for ${time}ms`)
return delay(time)
})
}
eat(food) {
return this.appendTask(() => {
console.log(`eating ${food}`)
})
}
printLength() {
return this.appendTask(() => {
console.log(`tasks left: ${this.tasks.length}`)
})
}
}
function delay(time) {
return new Promise((resolve) => {
setTimeout(() => {
resolve()
}, time)
})
}
function LazyMan(name) {
return new LazyManClass(name)
}
LazyMan('Bob')
.eat('fish')
.appendTask(() => {
console.log('start downloading')
return delay(3000).then(() => {
console.log('download completed')
})
})
.eat('meat')
.sleep(2000)
.eat('apple')
.sleepFirst(2000)
.printLength()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment