實現LazyManInit('Tony').eat('rice').sleep(1000).sleepFirst(2000)
阿新 • • 發佈:2020-12-17
程式碼是參考別人的,我就加點我寫的時候不理解的地方吧。
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);