LuckyWinty / fe-weekly-questions

A pro to record some interview questions every week...
MIT License
342 stars 34 forks source link

实现一个LazyMan,可以按照以下方式调用: #21

Open LuckyWinty opened 4 years ago

LuckyWinty commented 4 years ago

实现一个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~ 以此类推。

LuckyWinty commented 4 years ago
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))
}
luckymore commented 4 years ago

妙啊,next 执行器,贯穿始终

chenjigeng commented 3 years ago
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");