fe-weekly-questions
fe-weekly-questions copied to clipboard
实现一个LazyMan,可以按照以下方式调用:
实现一个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))
}
妙啊,next
执行器,贯穿始终
function LazyMan(str) {
const tasks = [
{
type: "hello",
msg: `Hi! This is ${str}!`,
},
];
const sleep = function (s) {
tasks.push({
type: "sleep",
time: s,
});
return this;
};
const sleepFirst = function (s) {
tasks.unshift({
type: "sleep",
time: s,
});
return this;
};
const eat = function (s) {
tasks.push({
type: "eat",
food: s,
});
return this;
};
const next = () => {
if (tasks.length === 0) return;
const task = tasks.shift();
if (task.type === "sleep") {
setTimeout(() => {
next();
}, task.time * 1000);
} else if (task.type === "hello") {
console.log(task.msg);
next();
} else {
console.log(`eat ${task.food}!`);
next();
}
};
setTimeout(() => {
next();
});
return {
sleep,
sleepFirst,
eat,
};
}
LazyMan("Hank");
LazyMan("Hank").sleep(10).eat("dinner");
LazyMan("Hank").sleep(10).eat("dinner").eat("supper");
LazyMan("Hank").sleepFirst(5).eat("supper");