Come affermato da Grumdrig è possibile scrivere codice come questo:
setTimeout(function() { iterateArray(array1); reportDone(1); }, 0);
setTimeout(function() { iterateArray(array2); reportDone(2); }, 0);
ma sarà ancora non eseguiti contemporaneamente . Ecco un'idea generale di ciò che accade dopo tali timeout si chiamano:
- Qualsiasi codice dopo le
setTimeout
chiamate verrà eseguito immediatamente, tra cui torna a chiamare funzioni.
- Se ci sono altri timer in coda che sono in corrispondenza del loro ritardo o intervallo, verranno eseguiti uno alla volta.
- Mentre un timer è in esecuzione, un altro potrebbe raggiungere il suo intervallo/tempo di ritardo, ma non verrà eseguito fino a quando non è terminato l'ultimo.
- Alcuni browser danno priorità agli eventi attivati dall'interazione dell'utente, ad esempio
onclick
e onmousemove
, nel qual caso le funzioni associate a tali eventi verranno eseguite a spese della precisione del timer.
- Continuerà fino all'apertura (nessun timer o gestore di eventi in precedenza richiesto per l'esecuzione). Solo allora verranno eseguite le funzioni nel codice di esempio. Di nuovo uno alla volta, con il primo probabile, ma non certo l'esecuzione prima. Inoltre, mi sto azzardando a supporre che alcuni browser potrebbero imporre un tempo di ritardo minimo, il che farebbe girare qualsiasi timer impostato con un ritardo di 0 millisecondi anche più tardi del previsto.
Ovviamente non vi è alcun vantaggio in termini di prestazioni per l'esecuzione di codice come questo. In ogni caso ci vorrà più tempo per completare le cose. Tuttavia, nei casi in cui un singolo task impiega così tanto tempo a bloccare il browser (e probabilmente invia "Script richiede troppo tempo" per gli avvisi del browser), può essere utile suddividerlo in pezzi di esecuzione più piccoli più veloci che vengono eseguiti sequenzialmente dopo un certo intervallo di tempo. , dando così al browser un po 'di tempo per respirare.
I Web worker sono stati citati e, se non si è interessati alla compatibilità di IE, è possibile utilizzarli per una concorrenza reale. Tuttavia ci sono alcune severe limitazioni sul loro uso imposte per ragioni di sicurezza.Per uno non possono interagire con il DOM in alcun modo, il che significa che le eventuali modifiche alla pagina devono ancora essere eseguite in modo sincrono. Inoltre, tutti i dati trasmessi da e verso i lavoratori sono serializzati in transito, il che significa che non è possibile utilizzare oggetti JavaScript reali. Detto questo, per l'elaborazione intensiva dei dati, i Web Worker sono probabilmente una soluzione migliore rispetto alla rottura di una funzione in più attività ritardate del timer.
Sembra che ti interessi l'elaborazione parallela, non necessariamente l'esecuzione asincrona? Non l'ho approfondito, ma gli iframe non usano un thread js separato? Non riesco a immaginare che sarebbe divertente, ma potresti essere in grado di svolgere alcune attività parallele utilizzando le funzioni negli iframe. – jball
Gli iframe potrebbero essere una tecnica interessante, anche se penso che il sovraccarico dell'iframe sarebbe più negativo di quello che darebbe la programmazione asincrona. – aepheus
Idea interessante, ma penso che nella maggior parte o in tutti i browser, un iframe utilizza lo stesso thread JS. In realtà penso in tutto tranne Chrome, tutte le finestre e le schede utilizzano lo stesso thread JS. – Grumdrig