2012-05-10 10 views
7

Sto cercando di prendere in giro un metodo che richiede molto tempo a scopo di test ma non riesce a trovare un buon modo per farlo in Javascript. Qualche buon approccio oltre a scrivere un loop molto lungo?Come si scrive un metodo sincrono di blocco in Javascript?

+0

cosa c'è di sbagliato con un ciclo molto lungo? o un ciclo che controlla l'ora? – Joseph

+0

Niente di male, vorrei solo poter fare qualcosa come "dormire (millisecondi)". È più difficile capire quanto è grande il ciclo, ma non è possibile correggere errori ed errori. –

+0

In Firefox è possibile utilizzare [trampolino] (http://tobyho.com/2010/12/10/trampolines-in-javascript-and/ "Trampolini in Javascript e la ricerca di un minor numero di callback annidati") per effettuare chiamate JavaScript asincrone sincrono. –

risposta

7

Che dire di a loop that checks time?

function sleep(milliSeconds){ 
    var startTime = new Date().getTime();     // get the current time 
    while (new Date().getTime() < startTime + milliSeconds); // hog cpu until time's up 
} 
+0

Bello. Piuttosto ovvio col senno di poi. –

+1

Ciò potrebbe causare il blocco del motore JavaScript da parte di altri thread (browser come Firefox <4.0 non permetteranno all'utente di cambiare scheda o fare altro). Alla fine il browser lo noterà e terminerà il tuo script. Non è una buona idea. –

+0

Funziona in Chrome, questo è tutto ciò che mi interessa. Questo ovviamente non sta andando in alcun codice implementato :) –

3

È possibile effettuare una chiamata AJAX sincrona a un server che differisce la risposta di un certo periodo di tempo come richiesto dal proprio script. Si noti tuttavia che questo metodo non funziona in Firefox poiché non supporta le chiamate AJAX sincrone.

basta usare questo semplice funzione sul lato client:

function sleep(microseconds) { 
    var request = new XMLHttpRequest; 
    request.open("GET", "/sleep.php?time=" + milliseconds); 
    request.send(); 
} 

Il codice per sleep.php sul lato server:

usleep(intval($_GET("sleep"))); 

Ora è possibile creare il blocco funzioni sincrone in JavaScript (con l'eccezione di Firefox) come segue:

alert("Hello"); 
sleep(1000000); // sleep for 1 second 
alert("World"); 
+0

+1 buono a sapersi, ma troppo lavoro :) –