fe-weekly-questions icon indicating copy to clipboard operation
fe-weekly-questions copied to clipboard

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

Open LuckyWinty opened this issue 5 years ago • 3 comments

实现一个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 avatar Dec 12 '19 03:12 LuckyWinty

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))
}

LuckyWinty avatar Dec 12 '19 03:12 LuckyWinty

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

luckymore avatar Feb 24 '20 08:02 luckymore

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");

chenjigeng avatar May 23 '21 17:05 chenjigeng