2013-05-13 6 views
17

Sto cercando di comprendere le funzioni asincrone Javascript e le richiamate.È Javascript sincrono (bloccante) o Asincrono (non bloccante) per impostazione predefinita

Mi sono bloccato sul concetto di funzioni di callback, dove sto leggendo in alcuni punti: sono utilizzate per eseguire sequenzialmente il codice (principalmente nel contesto di jquery e.g animate) e in alcuni luoghi specialmente nel contesto di Nodejs; sono utilizzati per avere un'esecuzione parallela asincrona ed evitare il blocco del codice.

Quindi qualche esperto in questo argomento può fare chiarezza su questo e chiarire questo fuzz nella mia mente (esempi ??). così ho potuto fare la mia mente per l'uso della funzione di callback

o che è solo dipende dal luogo di dove si sta chiamando/mettendo una funzione di callback nel codice? .

Grazie,

PS: ho paura che la questione sarebbe vicino soggettiva, ma comunque ho potuto aspettare risposta concreta per questo (forse alcuni esempi)

Edit: In realtà questo è il esempio da internet che mi rende ambiguo:

function do_a(){ 
    // simulate a time consuming function 
    setTimeout(function(){ 
    console.log('`do_a`: this takes longer than `do_b`'); 
    }, 1000); 
} 

function do_b(){ 
    console.log('`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a`'); 
} 

do_a(); 
do_b(); 

Risultato

`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a` 
`do_a`: this takes longer than `do_b` 

quando JS è sequenziale quindi do_b deve sempre venire dopo do_a secondo la mia comprensione.

+6

JavaScript è JavaScript; dipende dal contesto, dall'utilizzo, dal motore, ecc. –

+0

Puoi fornire qualche codice di esempio che non sei sicuro se blocca o non blocca? – Matt

+0

JavaScript è in generale sincrono, ma setTimeout è asincrono per definizione. Ecco un buon primer su di esso: https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout –

risposta

2

Nei processi di lunga durata del nodo utilizzare process.nextTick() per accodare le funzioni/i callback. Questo di solito è fatto nell'API del nodo e a meno che la tua programmazione (al di fuori dell'api) con qualcosa che sta bloccando o un codice che è a lungo andare, allora non ti influenza molto. Il link qui sotto dovrebbe spiegarlo meglio di quello che posso.

howtonode process.nextTick()

jQuery AJAX prende anche callback e tale in quanto la sua codificato di non aspettare le risposte del server prima di passare al successivo blocco di codice. Ricorda solo la funzione da eseguire quando il server risponde. Questo è basato sull'oggetto XMLHTTPRequest che i browser espongono. L'oggetto XHR ricorderà la funzione da richiamare quando la risposta ritorna.

setTimeout(fn, 0) di javascript eseguirà una funzione una volta che lo stack di chiamate è vuoto (prossimo tick libero disponibile) che può essere utilizzato per creare caratteristiche simili asincrone. setTimeout(fn, 0) question on stackoverflow

Per rendere estate le capacità asincrone di javascript è tanto per gli ambienti in cui sono programmati come javascript stesso. Non ottieni alcuna magia semplicemente usando molte chiamate di funzioni e callback a meno che tu non stia usando qualche API/script.

Jquery Deferred Object È un altro buon collegamento per le funzionalità asincrone di jQuery. Googling potrebbe trovare informazioni su come jQuery Deferred funziona anche per ulteriori approfondimenti.

22

Il nucleo di JavaScript è in gran parte sincrono, in quanto le funzioni completano completamente il loro compito, prima di completarlo. Prima dell'avvento di AJAX, in realtà era solo setTimeout e setInterval a fornire un comportamento asincrono.

Tuttavia, è facile dimenticare che i gestori di eventi sono, in pratica, codice asincrono. L'associazione di un gestore non richiama il codice del gestore e tale codice non viene eseguito fino a qualche ora inconoscibile in futuro.

Poi è arrivato AJAX, con le sue chiamate al server. Queste chiamate potevano essere configurate per essere sincrone, ma gli sviluppatori generalmente preferivano le chiamate asincrone e usavano metodi di callback per implementarle.

Poi, abbiamo visto la proliferazione di librerie JS e toolkit. Questi si sono sforzati di omogeneizzare le implementazioni di cose di diversi browser e si sono basati sull'approccio callback al codice asincrono. Hai anche iniziato a vedere molti più callback sincroni per cose come l'iterazione dell'array o la gestione dei risultati delle query CSS.

Ora, stiamo assistendo a Deferreds and Promises nel mix. Si tratta di oggetti che rappresentano il valore di un'operazione lunga e forniscono un'API per gestire tale valore quando arriva.

NodeJS tende verso un approccio asincrono a molte cose; tanto è vero Tuttavia questa è più una decisione di progettazione da parte loro, piuttosto che qualsiasi natura asincrona intrinseca di JS.

10

Javascript è sempre un linguaggio sincrono (bloccante) a thread singolo, ma possiamo fare in modo che Javascript esegua Asincrono tramite la programmazione.

codice sincrono:

codice
console.log('a'); 
console.log('b'); 

asincrono:

console.log('a'); 
setTimeout(function() { 
    console.log('b'); 
}, 1000); 
setTimeout(function() { 
    console.log('c'); 
}, 1000); 
setTimeout(function() { 
    console.log('d'); 
}, 1000); 
console.log('e'); 

This uscite: a e b c d

+0

cosa significa blocco in questo contesto? –