大厂(微信)面试题–实现lazyMan
- 2019 年 12 月 22 日
- 筆記
实现一个LazyMan,可以按照以下方式调用: LazyMan('Hank')输出: Hi! This is Hank! LazyMan('Hank').sleep(10).eat('dinner')输出 Hi! This is Hank! //等待10秒.. Wake up after 10 Eat dinner~ LazyMan('Hank').sleep(10).eat('dinner').eat('supper')输出 Hi This is Hank! Eat dinner~ Eat supper~ LazyMan('Hank').sleepFirst(5).eat('supper')输出 //等待5秒 Wake up after 5 Hi This is Hank! Eat supper~ 以此类推。
陷入思考…
陷入思考…
陷入思考…
陷入思考…
陷入思考…
陷入思考…
陷入思考…
陷入思考…
参考答案:
function LazyMan(name) { if(!(this instanceof LazyMan)){ return new LazyMan(name) } const cb = (next)=>{ console.log(`Hi This is ${name}!`) next() } this.cbs = [cb]; setTimeout(()=>{ this.next() },0) } LazyMan.prototype.eat = function (food){ const cb = (next)=>{ console.log(`Eat ${food}~`) next() } this.cbs.push(cb); return this } LazyMan.prototype.sleepFirst = function (time){ const cb = (next)=>{ setTimeout(()=>{ next() },time*1000) } this.cbs.unshift(cb); return this } LazyMan.prototype.sleep = function(time){ const cb = (next)=>{ setTimeout(()=>{ next() },time*1000) } this.cbs.push(cb); return this } LazyMan.prototype.next = function(){ if(this.cbs.length <= 0)return const first = this.cbs.shift() first(this.next.bind(this)) }