Skip to main content

lazyPig(阿里)

时间

2020-05-27

题目内容

评测题目 2: 实现一个 LazyPig,可以按照以下方式调用:

 LazyPig("Peggy")输出:
Hello,I'm Peggy!

LazyPig("Peggy").sleep(10).eat("dinner")输出
Hello,I'm Peggy!
//等待10秒..
Wake up after 10
Eat dinner~

LazyPig("Peggy").eat("dinner").eat("supper")输出
Hello,I'm Peggy!
Eat dinner~
Eat supper~

//以此类推。

实现

在同步阶段把所有链式调用的方法 push 到异步任务队列中,然后在 setTimeout 宏任务阶段依次执行

class _LazyMan {
constructor(name) {
this.taskQueue = []
this.run()
this.sayHi(name)
}
run() {
setTimeout(async () => {
for (let asyncFun of this.taskQueue) {
await asyncFun()
}
}, 0)
}
sayHi(name) {
this.taskQueue.push(async () => console.log(`Hi, this is ${name}`))
return this
}
eat(food) {
this.taskQueue.push(async () => console.log(`Eat ${food}`))
return this
}
sleep(second) {
this.taskQueue.push(async () => {
await this._timeout(second)
console.log(`Sleep ${second} s`)
})
return this
}
sleepFirst(second) {
this.taskQueue.unshift(async () => {
await this._timeout(second)
console.log(`Sleep first ${second} s`)
})
return this
}
_timeout(second) {
return new Promise((resolve) => {
setTimeout(resolve, second * 1e3)
})
}
}

// 测试
const LazyMan = (name) => {
return new _LazyMan(name)
}

// LazyMan('Hank');
LazyMan('Peggy').sleep(4).eat('dinner')
// LazyMan('Hank').eat('dinner').eat('supper');
// LazyMan('Hank').sleepFirst(3).eat('supper');