大廠(微信)面試題–實現lazyMan

  • 2019 年 12 月 22 日
  • 筆記

實現一個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))  }