2010-11-08 15 views
40

Ich habe folgendes Szenario:mit setTimeout synchron in JavaScript

setTimeout("alert('this alert is timedout and should be the first');", 5000); 
alert("this should be the second one"); 

muss ich den Code nach der setTimeout ausgeführt werden, nachdem der Code in der setTimeout ausgeführt wird. Da der Code, der nach dem setTimeout kommt, kein eigener Code ist, kann ich ihn nicht in die im setTimeout aufgerufene Funktion schreiben ...

Gibt es einen Weg darum herum?

Antwort

51

Ist der Code in einer Funktion enthalten?

function test() { 
    setTimeout(...);  

    // code that you cannot modify? 
} 

In diesem Fall könnten Sie die Funktion von der weiteren Ausführung, verhindern und es dann wieder laufen:

function test(flag) { 

    if(!flag) { 

     setTimeout(function() { 

      alert(); 
      test(true); 

     }, 5000); 

     return; 

    } 

    // code that you cannot modify 

} 
+0

Dies ist in der Tat eine akzeptable Problemumgehung, Großartig! – Nathan

+0

das ist großartig !! aber meiner ist ein völlig ähnlicher Fall, außer dass es viel Framework-Code gibt, der über dem setTimeout-Aufruf sitzt, und es kann nicht wieder zum Laufen gebracht werden ... und es wird nicht möglich sein, meinen Code in verschiedene Funktionen aufzuteilen ab dem Punkt, an dem setTimeout einsetzt. – mickeymoon

+2

@David Hedlund: Das ist ein netter Ansatz, aber gibt es eine Möglichkeit, den Code synchron zu machen, wenn der Code nicht in einer Funktion ist? –

5

Nein, da es in Javascript keine Verzögerungsfunktion gibt, gibt es keine Möglichkeit, dies zu tun, außer viel los zu warten (was den Browser sperren würde).

+0

Können Sie bitte das Besetzt warten Idee und ihre Arbeits erarbeiten. –

+5

'var bis = new Date(). GetTime() + 3000; while (neues Date(). getTime() AndreKR

+0

Ich vermeide es immer während der Überprüfung ohne Drosselung – tom10271

6

Setzen Sie ihn einfach in den Rückruf:

setTimeout(function() { 
    alert('this alert is timedout and should be the first'); 
    alert('this should be the second one'); 
}, 5000); 
+0

Aber er hat keinen Zugriff auf den Code, der' setTimeout' auslöst? – Marko

+0

Und da der Code, der nach dem setTimeout kommt, kein eigener Code ist, kann ich ihn nicht in die im setTimeout aufgerufene Funktion schreiben ... Ich arbeite mit einem Framework, also kann ich nicht einfach den Frameworks-Code einfügen da ... – Nathan

+0

Entschuldigung für das Missverstehen. Na dann hast du kein Glück. 'setTimeout' wenn immer asynchron. –

2
setTimeout(function() { 
    yourCode(); // alert('this alert is timedout and should be the first'); 
    otherCode(); // alert("this should be the second one"); 
}, 5000); 
1

Sie könnte versuchen, window.setTimeout mit Ihrer eigenen Funktion zu ersetzen, wie so

window.setTimeout = function(func, timeout) { 
    func(); 
} 

die nicht richtig funktionieren kann oder überhaupt. Abgesehen davon wäre Ihre einzige Option, den Originalcode zu ändern (was Sie nicht tun konnten)

Denken Sie daran, native Funktionen wie diese zu ändern, ist nicht gerade ein sehr optimaler Ansatz.

26

ich in einer Situation kam, wo ich letzte Woche eine ähnliche Funktionalität benötigt und es machte mich denke an diesen Beitrag. Grundsätzlich denke ich, das "Busy Waiting", auf das sich @AndreKR bezieht, wäre in vielen Situationen eine geeignete Lösung. Unten ist der Code, den ich benutzt habe, um den Browser zu manipulieren und eine Wartebedingung zu erzwingen.

function pause(milliseconds) { 
 
\t var dt = new Date(); 
 
\t while ((new Date()) - dt <= milliseconds) { /* Do nothing */ } 
 
} 
 

 
document.write("first statement"); 
 
alert("first statement"); 
 

 
pause(3000); 
 

 
document.write("<br />3 seconds"); 
 
alert("paused for 3 seconds");

Beachten Sie, dass dieser Code acutally Ihrem Browser hält. Hoffe es hilft jedem.

+0

Tatsächlich wird die Ausführung des Skripts nicht angehalten, aber das nächste Skript (nach der Funktion "Aufrufpause") wird ausgeführt, nachdem die Schleife ausgeführt wurde. Tricky, aber funktional erfüllt es die Notwendigkeit der Frage. –

0

ES6 (busy waiting)

const delay = (ms) => { 
    const startPoint = new Date().getTime() 
    while (new Date().getTime() - startPoint <= ms) {/* wait */} 
} 

Nutzung:

delay(1000) 
Verwandte Themen