Tutti Javascript script del gestore di eventi sono gestiti dalla coda di evento di un master. Ciò significa che i gestori di eventi vengono eseguiti uno alla volta e uno viene eseguito fino al completamento prima che il successivo pronto per l'esecuzione inizi a essere eseguito. Come tale, non ci sono le tipiche condizioni di gara in Javascript che si vedrebbero in una lingua multithread in cui più thread della lingua possono essere eseguiti contemporaneamente (o time sliced) e conflitti per l'accesso alle variabili. Ogni singolo thread di esecuzione in javascript verrà eseguito fino al completamento prima del successivo. Ecco come funziona Javascript. Evento estratto dalla coda eventi, il codice inizia a essere in esecuzione per gestire quell'evento. Questo codice viene eseguito da solo fino a quando non restituisce il controllo al sistema in cui il sistema preleverà l'evento successivo dalla coda degli eventi ed eseguirà quel codice fino a quando non restituirà il controllo al sistema.
Quindi le condizioni di gara tipiche causate da due thread di esecuzione che vanno nello stesso momento non si verificano in Javascript.
Questo include tutte le forme di eventi JavaScript tra cui: eventi utente (mouse, i tasti, ecc ..), eventi timer, eventi di rete (callback Ajax), ecc ...
L'unico posto si può effettivamente fare multi-threading in Javascript è con il HTML5 Web Workers, ma sono molto isolati dal normale javascript (possono solo comunicare con javascript normale tramite il passaggio di messaggi) e non possono manipolare il DOM affatto e devono avere i propri script e spazio dei nomi, ecc ...
Anche se tecnicamente non lo chiamerei condizione di gara, ci sono ioni in Javascript a causa di alcune delle sue operazioni asincrone in cui è possibile eseguire due o più operazioni asincrone e potrebbe essere imprevedibile quando ciascuna operazione verrà completata rispetto alle altre.Questo crea un'incertezza di temporizzazione che (se il tempo relativo delle operazioni è importante per il tuo codice) crea qualcosa per cui devi codificarti manualmente. Potrebbe essere necessario sequenziare le operazioni in modo da eseguirne una e attendere letteralmente che si completi prima di iniziare la successiva. Oppure, puoi iniziare tutte e tre le operazioni e poi avere del codice che raccoglie tutti e tre i risultati e quando sono tutti pronti, il tuo codice procede.
In Javascript moderno, le promesse vengono generalmente utilizzate per gestire questi tipi di operazioni asincrone.
Quindi, se avete avuto tre operazioni asincrone che ogni ritorno una promessa (come la lettura da un database, il recupero di una richiesta da un altro server, ecc ...), si potrebbe sequenziare manualmente, allora in questo modo:
a().then(b).then(c).then(result => {
// result here
}).catch(err => {
// error here
});
O, se si voleva tutti a correre insieme (tutti in volo allo stesso tempo) e appena sanno quando sono stati tutti fatti, si potrebbe fare:
Promise.all([a(), b(), c()])..then(results => {
// results here
}).catch(err => {
// error here
});
Mentre io non chiamare queste condizioni di gara, sono nella stessa famiglia generale di progettare il tuo codice per controllare inde terminare il sequenziamento.
C'è un caso speciale che può verificarsi in alcune situazioni nel browser. Non è davvero una condizione di competizione, ma se stai usando molte variabili globali con stato temporaneo, potrebbe essere qualcosa di cui essere consapevole. Quando il proprio codice causa la comparsa di un altro evento, il browser a volte chiama tale gestore eventi in modo sincrono anziché attendere che venga eseguito il thread corrente di esecuzione. Un esempio di questo è:
- click
- i cambiamenti gestore di eventi click si concentrano su un altro campo
- che altro campo ha un gestore di eventi per onfocus
- del browser chiama il gestore di eventi onfocus immediatamente
- gestisce il gestore di eventi onfocus
- viene eseguito il resto del gestore di eventi click (dopo la chiamata .focus)
Questa non è tecnicamente una condizione di competizione perché è nota al 100% quando verrà eseguito il gestore di eventi onfocus (durante la chiamata .focus()
). Ma, può creare una situazione in cui un gestore di eventi viene eseguito mentre un altro è nel mezzo dell'esecuzione.
Perché non basta che il flash chiami la funzione javascript? – zellio