2016-10-13 4 views
0

Ich habe ein Stück Code mit While-Schleife, die ich mit SetTimeout() stoppen möchte. Aber es scheint wie eine Endlosschleife, die nie setTimeout() auslöst. Wenn ich die While-Schleife entferne, wird das Timeout korrekt ausgelöst. Was ist bitte falsch?Wie endlose While-Schleife über setTimeout in Javascript zu beenden

$(document).ready(function() 
{ 
    var i = 0, s = false; 

    setTimeout(function() 
    { 
     s = true; 
     console.log("Timeuot!!!"); 
     console.log("s value is " + s); 
    }, 1000); 

    while(s === false) 
    { 
     console.log("this is while and s is " + s); 
     i++; 
    } 

    console.log("iterations: " + i); 
}); 
+0

@Quentin der 'S' innerhalb der setTimeout im globalen Bereich festgelegt ist. Warum liege ich falsch? –

+0

@RoyiNamir - Die an 'setTimeout' übergebene Funktion wird in einer anderen Funktion definiert. Es hat Zugriff auf den Umfang dieser Funktion. Da in diesem Bereich ein nicht-globales "s" ist, greift es auf dieses "s" zu. – Quentin

+0

@RoyiNamir h s innerhalb von setTimeout ist derjenige des umschließenden Bereichs, also der eine, der oben deklariert und definiert wurde. – pinturic

Antwort

6

JavaScript führt eine einzelne Ereignisschleife aus. Es wird nicht mitten in einer Funktion anhalten, um zu sehen, ob irgendwelche Ereignisse (wie Klicks oder Timeouts) eine andere Funktion auslösen.

Kurz gesagt: Es wird nicht die zeitgesteuerte Funktion ausgeführt, bis die While-Schleife beendet ist.


Um dies zu tun, hätten Sie normalerweise einen ereignisgesteuerten Iterator.

var i = 0, 
 
    s = false; 
 

 
setTimeout(function() { 
 
    s = true; 
 
    console.log("Timeuot!!!"); 
 
    console.log("s value is " + s); 
 
}, 1000); 
 

 
next(); 
 

 
function next() { 
 
    if (s) { 
 
    return done(); 
 
    } 
 
    console.log({ 
 
    s, i 
 
    }); 
 
    i++; 
 
    setTimeout(next, 0); 
 
} 
 

 
function done() { 
 
    console.log("iterations: " + i); 
 
}

+0

Mmmm. Aber es stoppt und zeigt, dass es nicht Endlosschleife ist. Http://jsbin.com/cewewarovo/1/edit?html, js, Konsole, Ausgabe –

+0

@RoyiNamir - JSbin scheint Code zu mangeln, um Leute zu stoppen DOS-Attacken mit es. 'while (s === false) {if (window.runnerWindow.protect.protect ({line: 13})) break; window.runnerWindow.proxyConsole.log (" das ist while und s ist "+ s); i ++ ;} '- Es fügt einen' Bruch 'dort hinzu. – Quentin

+0

Vielen Dank für die Klarstellung –

0

SetTimeout tun genannt wird nie die Tatsache, dass die während niemals endet und so das auch Dispatcher nicht die setTimeout geht auszulösen.

+0

Ja, ich habe es. Vielen Dank. –

1

Wie bereits erwähnt, die While-Schleife blockiert die eine und einzige Gewinde. So lassen Sie das Beispiel, das Ding tun Sie wollen, ersetzen Sie die while-Schleife mit setInterval (Funktion) wie folgt aus:

$(document).ready(function() 
{ 
    var i = 0, s = false; 

    setTimeout(function() 
    { 
     s = true; 
     console.log("Timeout!!!"); 
     console.log("s value is " + s); 
    }, 1000); 


    var interval = setInterval(function() { 
     console.log("this is while and s is " + s); 
     i++;  
     if (s) { 
     clearInterval(interval); 
     console.log("i is " + i) 
     } 
    }, 100);  
}); 
+0

Ja, ich habe es. Danke für das Beispiel. –

Verwandte Themen