2017-06-11 6 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); 

Das Problem bei diesem Ansatz ist, dass am Ende des während der Block I den Wert von i-i + 1 bin Einstellung, die ich denke, sollte auf dem aktuellen Zeitstempel gesetzt werden (dt.getTime()) Auf diese Weise kann future (ein Zeitstempelwert, bei dem die Callback-Funktion ausgeführt werden soll) mit dem aktuellen Zeitstempel verglichen werden, der der Wert i ist.Erstellen von benutzerdefinierten Funktion setTimeout()

Aber wenn ich i++ Kommentar und Kommentar- diese Zeile:

i = dt.getTime();

und das Skript ausführen, der Browser friert ein. Gibt es eine Möglichkeit, eine setTimout() Methode zu erstellen, die dem gleichen Zweck wie window.setTimeout() dienen würde?

+1

Es ist nicht wirklich möglich, 'setTimeout' in Benutzer Land Code zu simulieren, da JavaScript alle APIs belichten nicht direkt Funktionen der Ereigniswarteschlange hinzuzufügen. Anyways ..., was Ihre Frage eigentlich ist? –

+1

Sie sollte verstehen, dass, selbst wenn Sie die Endlosschleife Problem beheben, die Braue ser wird immer noch gesperrt. Das liegt daran, dass die Schleife verhindert, dass irgendetwas anderes ausgeführt wird, bis es beendet wird. –

+0

Werfen Sie einen Blick auf [** diese Antwort **] (https://Stackoverflow.com/a/41814108/6647153) einer mehr oder weniger similar Frage. –

Antwort

1

Das Problem mit Ihrem Code ist, dass dt.getTime() immer den gleichen Wert zurückgibt (nämlich die Zeit, wenn das dt Objekt erstellt wurde. Um diese Arbeit zu machen, Sie

dt = new Date(); 

tun müssen, bevor Sie setzen

i = dt.getTime(); 
+0

Genau das macht er. –

+0

@ibrahimmahrir: Nein, nicht in der Schleife. –

+0

Er tut es nur einmal, da er setTimeout aufruft. Also ändert sich die Unterbrechungsbedingung nicht und er bleibt in einer Endlosschleife. –

Verwandte Themen