LazyMan 实现...

2021-04-23  本文已影响0人  行走的蛋白质

// 实现一个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

class Cp {
  constructor(name) {
    this.tasks = [];
    const task = (name => _ => {
      console.log(`Hi! This is ${name}!`);
      this.next();
    })(name);
    this.tasks.push(task);
    setTimeout(_ => {
      this.next();
    })
  }

  next() {
    const task = this.tasks.shift();
    task && task();
  }

  eat(food) {
    const task = (food => _ => {
      console.log(`Eat ${food}~`);
      this.next();
    })(food);
    this.tasks.push(task);
    return this;
  }

  sleep(wait) {
    const task = (wait => _ => {
      setTimeout(_ => {
        console.log(`Wake up after ${wait}`);
        this.next();
      }, wait * 1000);
    })(wait);
    this.tasks.push(task);
    return this;
  }

  sleepFirst(wait) {
    const task = (wait => _ => {
      setTimeout(_ => {
        console.log(`Wake up after ${wait}`);
        this.next();
      }, wait * 1000);
    })(wait);
    this.tasks.unshift(task);
    return this;
  }
}

function LazyMan(name) {
  return new Cp(name);
}

LazyMan('hank').sleep(3).eat('dog').eat('chicken').sleepFirst(5);
上一篇下一篇

猜你喜欢

热点阅读