2013-05-13 2 views
17

Ich versuche Javascript Asynchronous Funktionen und Callbacks zu erfassen.Ist Javascript synchron (blockierend) oder asynchron (nicht blockierend) standardmäßig

Ich steckte auf dem Konzept der Callback-Funktionen fest, wo ich an einigen Stellen lese: Sie werden verwendet, um sequentielle Ausführung von Code (vor allem im Kontext von jQuery z. B. Animate) und einige Orte speziell im Kontext von Nodejs; Sie werden verwendet, um eine synchrone parallele Ausführung zu haben und das Blockieren von Code zu vermeiden.

So kann jemand Experte in diesem Thema bitte Licht auf diese und löschen Sie diese Fuzz in meinem Kopf (Beispiele ??). so konnte ich meine Meinung für die Verwendung von Callback-Funktion

oder das ist machen, hängt allein von dem Ort, von dem Sie anrufen/eine Callback-Funktion in Ihrem Code platzieren? .

Danke,

PS: Ich habe Angst, dass diese Frage nahe wie subjektiv sein würde, aber dennoch konnte ich konkrete Antwort für diese erwarten (vielleicht einige Beispiele)

Edit: dies tatsächlich ist die Beispiel aus dem Internet, die mir mehrdeutig macht:

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(); 

Ergebnis

`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` 

Wenn JS sequentiell ist, dann sollte do_b immer nach do_a nach meinem Verständnis kommen.

+6

JavaScript ist JavaScript; Es hängt vom Kontext, der Verwendung, der Engine usw. ab. –

+0

Können Sie einen Beispielcode angeben, bei dem Sie nicht sicher sind, ob Blockierung oder Nichtblockierung vorliegt? – Matt

+0

JavaScript ist im Allgemeinen synchron, aber setTimeout ist per Definition asynchron. Hier ist ein guter Grund: https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout –

Antwort

2

In lang laufenden Knotenprozessen verwenden Sie process.nextTick(), um die Funktionen/Rückrufe in eine Warteschlange zu stellen. Dies geschieht normalerweise in der API des Knotens und es sei denn, Ihre Programmierung (außerhalb der API) mit etwas, das blockiert oder Code, der lange läuft, dann beeinflusst es Sie nicht wirklich viel. Der Link unten sollte es besser erklären, als ich es kann.

howtonode process.nextTick()

jQuery AJAX nimmt auch Rückrufe und wie es codiert sein nicht für Server-Antworten zu warten, bevor auf den nächsten Block des Codes übergehen. Es merkt sich nur die Funktion, die ausgeführt wird, wenn der Server antwortet. Dies basiert auf dem XMLHTTPRequest-Objekt, das von den Browsern verfügbar gemacht wird. Das XHR-Objekt erinnert sich an die Funktion, die zurückgerufen wird, wenn die Antwort zurückkehrt.

setTimeout(fn, 0) von Javascript wird eine Funktion ausführen, sobald der Aufruf-Stapel leer ist (nächste verfügbare freie Häkchen), die verwendet werden kann, um asynchrone Features zu erstellen. setTimeout(fn, 0) question on stackoverflow

Um die Async-Fähigkeiten von Javascript zu summerisieren, ist das genauso mit den Umgebungen zu tun, in denen sie als Javascript selbst programmiert sind. Sie erhalten keine Magie, indem Sie nur viele Funktionsaufrufe und Rückrufe verwenden, es sei denn, Sie verwenden ein API/Skript.

Jquery Deferred Object Ist ein weiterer guter Link für Async-Funktionen von jQuery. Googling kann Sie Informationen darüber finden, wie jQuery Deferred auch für mehr Einblick funktioniert.

22

Der Kern von JavaScript ist weitgehend synchron, in dem Funktionen ihre Aufgabe vollständig abschließen, bevor sie abgeschlossen werden. Vor dem Aufkommen von AJAX gab es wirklich nur setTimeout und setInterval, die asynchrones Verhalten zur Verfügung stellten.

Es ist jedoch leicht zu vergessen, dass Event-Handler effektiv Async-Code sind. Durch das Anhängen eines Handlers wird der Handler-Code nicht aufgerufen, und dieser Code wird erst zu einem bestimmten Zeitpunkt in der Zukunft ausgeführt.

Dann kam AJAX, mit seinen Aufrufen an den Server. Diese Aufrufe könnten so konfiguriert werden, dass sie synchron sind, aber im Allgemeinen bevorzugten die Entwickler Async-Aufrufe und verwendeten Callback-Methoden, um sie zu implementieren.

Dann sahen wir die Verbreitung von JS-Bibliotheken und Toolkits. Diese strebten danach, die Implementierungen von verschiedenen Browsern zu homogenisieren und bauten den Callback-Ansatz für asynchronen Code auf. Sie haben auch viel mehr synchrone Rückrufe für Dinge wie Array-Iteration oder Bearbeitung von CSS-Abfrageergebnissen gesehen.

Jetzt sehen wir Deferreds und Versprechen im Mix. Diese Objekte stellen den Wert einer lang andauernden Operation dar und stellen eine API für die Verarbeitung dieses Werts bereit, wenn dieser ankommt.

NodeJS neigt zu einem asynchronen Ansatz für viele Dinge; So viel ist wahr. Dies ist jedoch eher eine Designentscheidung als eine inhärente asynchrone Natur von JS.

10

Javascript ist immer eine synchrone (blockierende) Einthread-Sprache, aber wir können Javascript asynchron durch Programmierung wirken lassen.

Synchronous Code:

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

Asynchronous-Code:

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

Diese Ausgänge: a b c d e

+0

Was bedeutet Blockieren in diesem Zusammenhang? –

Verwandte Themen