实现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").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) {

  // 任务队列
  this.taskList = [];

  var self = this;

  var fn = (function(name){
    return function() {
      console.log("Hi! This is " + name + "!");
      self.next();
    };
  })(name);

  this.taskList.push(fn);

  setTimeout(function(){
    self.next();    
  },0);           
}

_LazyMan.prototype.next = function() {
  if(this.taskList.length > 0) {
    var fn = this.taskList.shift();
    fn && fn();
  }
};

_LazyMan.prototype.eat = function(str) {
  var self = this;
  var fn = function() {
    console.log("Eat " + str + "~!");
    self.next();
  };
  this.taskList.push(fn);
  return this;
};

_LazyMan.prototype.sleep = function(time) {
  var self = this;
  var fn = function() {
    setTimeout(function(){
      console.log("Wake up after " + time + "!");
      self.next();
    }, time);
  };
  this.taskList.push(fn);
  return this;
};

_LazyMan.prototype.sleepAfter = function(time) {
  var self = this;
  var fn = function() {
    setTimeout(function(){
      console.log("Wake up after " + time + "!");
      self.next();
    }, time);
  };
  this.taskList.unshift(fn);
  return this;
};

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

方式二:

(function(){

  var taskList = [];

  // 订阅
  function subscribe() {
    var param = {};
    var args = Array.prototype.slice.call(arguments);
  
    param.msg = args[0];
    param.args = args.slice(1);
   
    if(param.msg == "sleepFirst") {
      taskList.unshift(param);
    } else {
      taskList.push(param);
    }
  }

  // 发布
  function publish() {
    if(taskList.length > 0) {
      run(taskList.shift());
    }
  }

  // 运行
  function run(param) {
    var option = param.msg;
    var args = param.args;

    switch(option) {
      case "lazyMan": lazyMan.apply(null, args);break;
      case "eat": eat.apply(null, args);break;
      case "sleep": sleep.apply(null, args);break;
      case "sleepFirst": sleepFirst.apply(null, args);break;
      default:;
    }
  }

  // 各种方法
  function lazyMan(str) {
    LazyManLog("Hi! This is " + str);
    publish();
  }

  function eat(str) {
    LazyManLog("Eat " + str + "~");
    publish();
  }

  function sleep(time) {
    setTimeout(function(){
      LazyManLog("Wake up after " + str);
      publish();
    },time);
  }

  function sleepFirst(time) {
    setTimeout(function(){
      LazyManLog("Wake up after " + str);
      publish();
    },time);
  }

  // 输出
  function LazyManLog(str) {
    console.log(str);
  }

  // LazyMan类
  function LazyMan() {}

  LazyMan.prototype.eat = function(str) {
    subscribe("eat", str);
    return this;
  }

  LazyMan.prototype.sleep = function(time) {
    subscribe("sleep", time);
    return this;
  }

  LazyMan.prototype.sleepFirst = function(time) {
    subscribe("sleepFirst", time);
    return this;
  }

  window.LazyMan = function(name) {
    subscribe('lazyMan', str);
    setTimeout(function() {
      publish();
    }, 0);

    return new LazyMan();
  }

  
})();

 参考:

 http://div.io/topic/1915

 http://web.jobbole.com/89626/

原文地址:https://www.cnblogs.com/dreamerjdw/p/6382492.html