1. 程式人生 > 實用技巧 >實現LazyManInit('Tony').eat('rice').sleep(1000).sleepFirst(2000)

實現LazyManInit('Tony').eat('rice').sleep(1000).sleepFirst(2000)

程式碼是參考別人的,我就加點我寫的時候不理解的地方吧。

function LazyMan(name) {
  this.taskList = [];
  console.log(`I am ${name}`);
   setTimeout(() => {
    this.next();
  }, 0)  //setTimeout是非同步任務,js會先執行同步任務,這裡的同步任務就是把要執行的所有任務推入一個數組。
}


LazyMan.prototype.next = function () {
  if (this.taskList.length > 0) {
    this.taskList.shift()(); //
從陣列的第一個任務開始執行。 } } LazyMan.prototype.eat = function (food) { this.taskList.push(() => { console.log(`I am eating ${food}`); this.next(); //每個任務執行完彈出下一個任務,這樣當前的js執行棧只有這一個任務,就不會出現任務執行順序錯亂。 }) return this; } LazyMan.prototype.sleep = function (time) { this.taskList.push(() => { setTimeout(()
=> { console.log(`等待 ${time / 1000} 秒`) this.next(); }, time); }) return this; } LazyMan.prototype.sleepFirst = function (time) { this.taskList.unshift(() => { setTimeout(() => { console.log(`先等待 ${time / 1000} 秒`) this.next(); }, time) }) //將sleepFirst推入第一個任務,讓它不管在什麼位置都第二個執行
return this; } function LazyManInit(name) { return new LazyMan(name) } LazyManInit('Tony').eat('rice').sleep(1000).sleepFirst(2000);