2017-06-11 97 views
0
var td = { 
setTimeout: function(callback, ms){ 
var dt = new Date(); 
    var i = dt.getTime(), future = i+ms; 
    while(i<=future){ 
     if(i === future){ 
     callback(); 
     } 
     // i = dt.getTime(); 
     i++; 
    } 
} 
}; 
td.setTimeout(function(){ 
    console.log("Hello"); // executes immediately 
}, 3000); 

這種方法的問題是,在同時塊我的i值設置爲i + 1我認爲結束時,應設置爲當前時間戳(dt.getTime())那麼,future(回調函數應該執行的時間戳值)可以與當前時間戳進行比較,該值是i的值。創建自定義的setTimeout()函數

但是,當我註釋掉i++並取消這一行:

I = dt.getTime();

並運行腳本,瀏覽器凍結。有沒有辦法創建一個setTimout()方法,可以達到與window.setTimeout()相同的目的?

+1

它是不是真的可以模擬'setTimeout'用戶代碼的土地,因爲JavaScript不公開任何API直接函數添加到事件隊列。反正...什麼實際上是你的問題? –

+1

你應該明白,即使你修復了無限循環問題,眉毛ser仍然會鎖定。這是因爲循環會阻止任何其他內容被執行,直到它終止。 –

+0

看看[**這個答案**](https://stackoverflow.com/a/41814108/6647153)或多或少的類似問題。 –

回答

1

與您的代碼的問題是,dt.getTime()總是返回相同的值(即當DT對象的創建時間。爲了使這個工作,你需要做之前

dt = new Date(); 

您設置

i = dt.getTime(); 
+0

這正是他在做的。 –

+0

@ibrahimmahrir:不,不在循環中。 –

+0

他只做一次,因爲他打電話setTimeout ..所以休息條件不會改變,他停留在無盡的循環 –