2013-02-28 17 views
14

Si consideri la seguente funzione in esecuzione,Le funzioni JavaScript sono asincrone?

function loadPage() 
{ 
    takeInput(); 
    processInput(); 
    outputInput(); 
} 

In che ordine sarebbero stati giustiziati (ho read che ne consegue pila in modo opzione 2 sarà la risposta)?

Opzione # 1

  1. takeInput();
  2. processInput();
  3. outputInput();

Opzione # 2

  1. outputInput();
  2. processInput();
  3. takeInput();

risposta

16

Le funzioni JavaScript sono non asincrone. Alcune funzioni molto limitate hanno un'API asincrona:

addEventListener, setTimeout, setInterval. Questi sono gli unici 3 (che ho pensato fosse molto sorprendente).

Permettono di passare una chiamata che può chiamare alla fine. Ad esempio quando scade un timer o quando un utente fa clic su qualcosa o quando una richiesta AJAX viene completata.

JavaScript ha un ciclo di eventi. Il ciclo degli eventi elabora ogni evento così come viene. Se fai clic su un pulsante 3 volte e poi scade un timer, sarà anche l'ordine in cui vengono gestiti gli eventi. È tutto molto ben definito e determinato.

Inoltre, JavaScript non ha thread, esegue un evento completamente finché non rimane nulla da fare (si ritorna) prima di iniziare il prossimo evento. Quindi gli eventi non interferiranno mai in alcun modo. Questo ti permette di formulare ipotesi molto forti sullo stato dei tuoi dati.

+4

L'unico 3? Che dire, bene, tutti gli altri? – Pointy

+1

Quali altri? Non ce ne sono altri. Assegnare un onclick o onreadystatechange (per esempio) è solo una bastardizzazione di 'addEventListener'. – Halcyon

+2

Che mi dici di XHR? Che dire di tutte le API disponibili in Node.js? – Pointy

0

No, non è per default/standard, anche se ci sono metodi asincroni. E jQuery usa molto più il comportamento asincrono. Ma in ogni caso, è soggettivo e non si può dire che "Tutto il codice JavaScript è questo o che".

I metodi vengono sempre eseguiti nell'ordine in cui sono chiamati; l'asincronia tra loro significa che chiunque può completarsi prima di un altro, anche se chiamato in seguito.

8

Le funzioni JavaScript sono asincrone?

Alcuni sono, la maggior parte non lo sono.

In che ordine sarebbero stati giustiziati

Saranno eseguite nell'ordine in cui essi sono chiamati. Dal momento che sono tutti chiamati dalla stessa funzione, ciò avverrà in un semplice ordine lineare.

Se uno di essi è scritto in modo asincrono, potrebbe non completare tutte le attività nello stesso ordine. Per example:

function a() { 
    console.log('a'); 
} 
function b() { 
    console.log('b'); 
} 
function c() { 
    console.log('c'); 
} 
function aAsync() { 
    setTimeout(a, 500); 
} 

function load() { 
    aAsync(); 
    b(); 
    c(); 
} 
load(); 
+1

Quindi c() aspetterà sempre che b() sia completato fintanto che tutto il codice in b è sincrono? Quindi b può contenere 1000 righe di codice sincrono e c sarà ancora eseguito dopo b di? Assicurati semplicemente ^^ – Vincent

+0

Un buon esempio che evidenzi l'ordine delle operazioni quando il codice è asincrono all'interno delle funzioni genitore. Sarà un macello se iniziamo ad aggiungere il codice asincrono dentro b, c. Con questo, dovremmo usare Promises: D –

1

JavaScript non è, in genere asincrono, ma ha guidato metodi asincroni ed eventi.

Le chiamate Ajax sono i grandi metodi asincroni.

Per gli eventi, non sono sicuro che sia possibile garantire un ordine di esecuzione, ma potrei sbagliarmi.

0

Javascript è una bestia a thread singolo, quindi le attività in senso stretto non sono asincrone come si potrebbe pensare in termini di generazione di thread figlio per l'esecuzione di codice. I meccanismi che forniscono questo creano l'illusione di asincronicità, ma è ancora a thread singolo.

+1

asincrono! = Parallelo – Quentin

1

Javascript non è Asincrono.
Funziona in modo sincrono, ovvero esegue una riga di codice alla volta. Quando viene eseguito il codice javascript, viene creato innanzitutto un contesto di esecuzione globale e se si chiama una funzione dal contesto di esecuzione globale, viene creato un altro contesto di esecuzione dal motore javascript e posizionato nella parte superiore dello stack di esecuzione (esecuzione globale contesto è già nello stack) e se c'è un'altra funzione chiamata da quella funzione, viene creato un altro contesto di esecuzione e la dimensione dello stack continua ad aumentare.

Quindi, javascript motore continua a funzionare questo codice una riga alla volta e in questo processo, se c'è qualunque richiesta incendi evento/HTTP, il browser li mette in coda EVENTO. Quindi, il punto è che il motore javascript non elaborerà gli eventi in coda finché lo stack di esecuzione non sarà vuoto. E quando il motore ha finito con lo stack di esecuzione, cerca periodicamente se c'è un gestore di eventi per l'evento corrente in coda e crea in modo simile il contesto di esecuzione per quel gestore e lo esegue all'interno. Quindi, l'intero processo è solo sincrono e l'asincrona viene gestita dalle altre parti del browser come (motore di rendering o motore http) mentre il motore javascript continua a eseguire il codice in modo sincrono.

Quindi, nel tuo caso, da qualsiasi contesto funzione loadpage è stato invocato, il suo contesto di esecuzione è stato creato e e posto in cima alla pila. Quindi, richiama la funzione takeinput, il suo exec. il contesto viene creato e il contesto di altre funzioni non verrà creato e inserito nello stack finché il contesto takeinput non viene estratto dallo stack di esecuzione. Quindi, l'ordine corretto sarà takeinput, processinput e outputinput.

Spero che risponda alla tua domanda.

Problemi correlati