Ci sto pensando e questo è quello che mi è venuto in mente:
Vediamo questo codice qui sotto:
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
Arriva una richiesta e il motore JS inizia a eseguire il codice sopra per gradi. Le prime due chiamate sono chiamate di sincronizzazione. Ma quando si tratta di setTimeout
metodo, diventa un'esecuzione asincrona. Ma JS ritorna immediatamente da esso e continua l'esecuzione, che si chiama Non-Blocking
o Async
. E continua a lavorare su altri ecc.
I risultati di questa esecuzione sono i seguenti:
ACDB
Quindi sostanzialmente il secondo è setTimeout
stato completato per primo e la sua funzione di callback viene eseguita prima della prima e questo ha senso.
Stiamo parlando di un'applicazione a thread singolo qui. JS Engine continua a eseguirlo e, a meno che non completi la prima richiesta, non passerà alla seconda. Ma il bello è che non aspetterà che le operazioni di blocco setTimeout
vengano risolte, quindi sarà più veloce perché accetta le nuove richieste in arrivo.
Ma le mie domande sorgono sui seguenti elementi:
# 1: se stiamo parlando di un'applicazione a thread singolo, quale meccanismo elabora setTimeouts
mentre il motore JS accetta più richieste ed esegue? In che modo il singolo thread continua a funzionare su altre richieste? Cosa funziona setTimeout
mentre altre richieste continuano ad arrivare e vengono eseguite.
# 2: Se queste setTimeout
funzioni vengono eseguite dietro le quinte mentre arrivano e vengono eseguite più richieste, che cosa esegue le esecuzioni asincrone dietro le quinte? Come si chiama questa cosa di cui parliamo EventLoop
?
# 3: Ma non dovrebbe essere messo l'intero metodo in EventLoop
modo che l'intera cosa venga eseguita e venga chiamato il metodo di callback? Questo è quello che capisco quando parlo di funzioni di callback:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
Ma in questo caso, come fa JS Engine a sapere se si tratta di una funzione asincrona in modo che possa mettere il callback nel EventLoop
? Forse qualcosa come la async
parola chiave in C # o una sorta di attributo che indica che il metodo che JS Engine prenderà è un metodo asincrono e dovrebbe essere trattato di conseguenza.
# 4: Ma un articolo dice abbastanza contrario a quello che stavo indovinando su come potrebbero funzionare le cose:
Event Loop è una coda di funzioni di callback. Quando viene eseguita una funzione asincrona, la funzione di richiamata viene inserita nella coda. Il motore JavaScript non inizia l'elaborazione del ciclo degli eventi fino a quando non viene eseguito il codice dopo l'esecuzione di una funzione asincrona.
# 5: E qui c'è questa immagine che potrebbe essere utile, ma la prima spiegazione nell'immagine sta dicendo esattamente la stessa cosa menzionata nella domanda numero 4:
Quindi la mia domanda qui è di ottenere alcuni chiarimenti sugli elementi sopra elencati?