2016-04-07 7 views
1

Ich versuche, eine Zeitmenge setTimeout. Ich meine, ich könnte es einfach so machen, aber ich habe das Gefühl, dass es einen besseren Weg zur selben Sache gibt. Die Verwendung einer For-Schleife fühlt sich überhaupt nicht effizient an (obwohl ich ein Neuling bin und keine Ahnung habe).Wie setze ich Timeout sehr oft? Javascript

for (var i = 0; i < 1000, i++;){ 
    setTimeout(myFunction, 5); 
} 
function myFunction(){ 
    //Do something cool 
} 

Danke und bitte verwenden Sie keine JQuery

+0

'setTimeout (meineFunktion, 5 * i);'? – Rayon

+2

Wie wäre es stattdessen 'setInterval()' zu verwenden? –

+0

Keine der oben genannten sind besonders nützlich - die '5 * i 'erstellt immer noch 1000 gleichzeitige Timer, und' setInterval' wird im Allgemeinen am besten vermieden, da es schlechte Timing-Garantien hat. – Alnitak

Antwort

-1

Hier ist ein nützliches Muster für pseudo-rekursiv eine Funktion f, ruft n mal mit einer Verzögerung zwischen:

function setTimeoutRepeat(f, delay, n) { 
    (function loop() { 
     if (n-- > 0) { 
      f(); 
      setTimeout(loop, delay); 
     } 
    })(); 
} 

setIntervalRepeat(myFunction, 5, 1000); 
+0

Wenn regelmäßige Perioden wichtig sind und die Arbeit etwas zeitaufwändig ist, könnte setInterval besser passen.tail-called setTimeout kann sich im Laufe der Zeit ausbreiten, so dass es mehr als 5000 ms dauern kann, um zu vervollständigen, während ein Intervall in 5000 ms durchgeführt werden sollte. Vauge braucht auf OPs Teil aber ... – dandavis

+0

@dandavis Ich habe es in den Kommentaren oben angedeutet, aber das Problem mit 'setInterval' ist die Umkehrung - wenn Timer-Ereignisse verpasst werden (vielleicht weil die Registerkarte im Hintergrund ist, oder Da die Funktion zu lange dauert, können 'setInterval'-Ereignisse gestapelt werden und dann alle sofort ausgelöst werden, ohne dass die angegebene Verzögerung zwischen den Iterationen abgewartet wird. – Alnitak

-2

Well Ich weiß nicht, warum Sie nicht mögen für() Schleife, vielleicht mögen Sie Rekursion mehr:

function myFunction(){ 
    //Do something cool 
    console.log('Cool!\n'); 
} 

(function re(i) { 
    if (i>0) { 
     setTimeout(myFunction, 5); 
     re(i-1); 
    } 
}) (1000); 

Beachten Sie, dass diese Lösung weniger effektiv ist, da sie stack (oder was auch immer in JS verwendet wird) für rekursive Aufrufe verwendet.

Sie könnten auch über die Verwendung der Funktion map() nachdenken, aber auch hier müssen Sie irgendwo ein Array speichern. Gute alte für() Schleife wäre in diesem Fall Ihre beste Aufnahme.

+0

aber es gibt keine Timer in diesem? – Alnitak

+0

Dank Alnitak, ich habe verpasst, myFunction() mit setTimeout() zu wickeln. Bearbeitete die Antwort. –

+0

Dies wird nicht funktionieren. Die Funktion re wird tausendmal aufgerufen, bevor myFunction einmal aufgerufen wird. Da Javascript single threaded ist, häufen sich die Timeout-Aufrufe an, bis der aktuelle Thread beendet wird. Fügen Sie der Funktion re eine Konsolenmeldung hinzu und sie kann sie in Aktion sehen. Aus diesem Grund muss das Timeout innerhalb der myFunction aufgerufen werden. – markbernard