一道前端面试题
.
实现一个 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”).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 L(name){
this.taskArr = []; //任务队列
this.name = name;
const task = ()=>{
console.log('hi , this is ' + this.name);
this.next();
};
this.taskArr.push(task);
setTimeout(()=>this.next(),0); //利用异步执行
};
L.prototype = Object.assign(L.prototype,{
sleep:function(time){
this.sleepTask(time)
return this; //链式调用返回this
},
sleepFirst:function(time){
this.sleepTask(time,true);
return this;
},
next:function(){
const task = this.taskArr.shift();
task && task();
},
sleepTask:function(time,f){
const task = () => {
setTimeout(() => {
console.log('Wake up after'+time)
this.next()
}, time * 1000)
};
f ? (this.taskArr.unshift(task)) : (this.taskArr.push(task));
},
eat:function(t){
const task = ()=>{
console.log('Eat '+t+' ~');
this.next();
};
this.taskArr.push(task);
return this;
},
})
function LazyMan(name){
return new L(name);
}