2017-12-13 12 views
0

Ich möchte JavaScript-Ausführung auf Client-Seite für eine bestimmte Anzahl von Millisekunden (z. B. Schlaf) völlig synchrone blockieren, indem Sie einige JavaScript an der Spitze Die Seite.Blockieren JavaScript-Ausführung für eine bestimmte Zeit ohne unnötige Berechnung

Während des Wartens sollte nichts passieren. Die Seite sollte nicht weiter geladen werden. Es sollte nicht reagieren. Außerdem möchte ich, wenn möglich, eine Genauigkeit von 1-10 Millisekunden haben, und die Wartezeit kann über 1000 Millisekunden betragen.

Der Standard "Lösung" für dieses Problem ist ... eine andere Frage zu stellen, weil dies NICHT etwas ist, das Sie normalerweise tun möchten. Was Sie normalerweise tun möchten, ist etwas in Richtung await Promise.delay(1000).

Also bin ich mir der Probleme bewusst, die dabei auftreten, ich bin mir bewusst, dass es unter fast allen Umständen eine schreckliche Idee ist, aber ich muss es trotzdem tun. Und um Ihre Seele baumeln zu lassen, wird die Seite nur von einem kopflosen Browser benutzt, so dass keine Benutzer bei der Ausführung dieses Hacks verletzt werden.

Eine tatsächliche Lösung für das Problem wäre:

while (expectedTime > Date.now()) { } 

die sehr gut funktioniert. Aber es hat den Nebeneffekt viel unnötige Berechnungen zu machen, wenn ich nur die Ereignisschleife an stop sagen will.

Ich denke, der Trick könnte sein, die Seite zu zwingen, einige synchrone I/O für die ersten paar 100ms von ms zu tun und dann auf die obige Taktik zurückgreifen, aber ich bin nicht sicher, wie dies zu erreichen. Ich kann den Server auch benutzen, wenn das hilft.

+0

WEB Javascript Kontext hat keinen „Schlaf“ wie-Funktion zur Verfügung, die die inneren Ereignisschleife setzen würde in dem Ruhezustand und CPU-Zyklen zu speichern. Aus welchem ​​Grund sollte Ihre Webseite warten? – Stphane

Antwort

-1

Versuchen Sie es mit async/await Syntax, werfen Sie einen Blick darauf.

async function stop_fn() { 
 
    var a = 99999999 
 
    var b = 11111111 
 
    console.log('hello there') 
 

 
    //This will stop the execution without CPU blocking 
 
    await new Promise(next=> setTimeout(()=> next(), 4000)) 
 

 
    console.log('After 4000ms', a) 
 

 
    //Another 4000ms stop 
 
    await new Promise(next=> setTimeout(()=> next(), 4000)) 
 
    console.log('after 4000ms more, please stop it', b) 
 

 
    return 'end of this' 
 
} 
 
stop_fn()

+0

Das ist ziemlich spät, aber das wird nicht funktionieren. Ich möchte die Ereignisschleife blockieren, wie ich in der Frage erwähnt habe. Ich erwähnte diese Art von Dingen als etwas, das für mich nicht funktionieren würde. – GregRos

+0

Verwenden Sie dann eine unendliche while für N Sekunden, wenn Sie die Ereignisschleife blockieren möchten, aber das macht keinen Sinn. –

+0

Könnten Sie bitte eine Frage das nächste Mal bis zum Ende durchlesen, bevor Sie antworten? Ich erwähne immer wieder, dass dies normalerweise keinen Sinn ergibt, aber ich muss es trotzdem tun. Ich gebe eine While-Schleife als Beispiel für eine mögliche Lösung, aber ich gebe mehrfach an, dass das Problem damit die unnötige Berechnung ist. – GregRos

-1
//random blocking function 
function blockCpu(ms) { 
    var now = new Date().getTime(); 
    while(true) {  
     if (new Date().getTime() > now +ms) 
      return; 
    } 
} 
+0

Das ist genau das, was ich in der Frage * erwähnt habe. Ich weiß bereits, dass du das tun kannst. Ich bat um etwas Besseres. Weil dies dazu führt, dass die CPU für lange Zeit in Schwierigkeiten gerät und andere Prozesse beeinträchtigt werden. – GregRos

Verwandte Themen