2012-12-10 8 views

Antwort

28

JavaScript selbst ist synchron und single-threaded. Sie können keine asynchrone Funktion schreiben; plain JS hat keine Timing-API. Es wird keine Nebenwirkungen von parallelen Threads geben.

Was können Sie tun, ist es, einige APIs, die von Ihrer Umgebung (Node.js, Web-Browser) verwendet werden, solange können Sie asynchrone Aufgaben planen - mit Timeouts, Ajax, FileAPI, requestAnimationFrame, nextTick, Webworkers, DOM-Ereignisse, was auch immer.

Ein Beispiel setTimeout mit (von der HTML Timing API zur Verfügung gestellt):

window.setTimeout(function() { 
    console.log("World"); 
}, 1000); 
console.log("Hello"); 

Update: Seit ES6 gibt es verspricht als asynchrone primitive in einfache JavaScript gebaut, so dass Sie

tun können
Promise.resolve("World").then(console.log); // then callbacks are always asynchronous 
console.log("Hello"); 

Aber sie sind nicht wirklich hilfreich, wenn es nichts gibt, auf das man warten könnte (wie eine Zeitüberschreitung). Und sie ändern auch nichts an dem Threading-Modell. Die gesamte Ausführung wird vollständig ausgeführt, ohne dass irgendwelche Ereignisse in der Mitte stören.

+1

Gute Antwort, aber war ein Beispiel mit' bind' wirklich notwendig? Könnte das OP noch mehr verwirren ... – bfavaretto

+0

+1, sehr wahr; Async-Tasks werden nur in der Ausführungswarteschlange verschoben. Daher der (manchmal) nützliche Trick mit 'setTimeout (func, 0)'.) – raina77ow

+0

@bfavaretto: Ich wollte Xeanos Antwort nicht wiederholen. Changed jetzt, um Verwirrung zu reduzieren :-) – Bergi

7

Dies ist asynchron:

setTimeout(function(){ 
    console.log('1'); 
}, 2000); 

console.log('2'); 

2 wird auf die Konsole geschrieben werden vor 1. Weil setTimeout asynchron ist.

7

Hier ist ein sehr einfaches Beispiel:

for (var i = 0; i < 10; i++) { 
    window.setTimeout(function() { 
    console.log(i); 
    }, 2000); 
} 

Sie könnten diese erwarten console.log() Sie 0, 1, 2 usw. zu zeigen, ruft, wie in diesem Code-Schnipsel:

for (var i = 0; i < 10; i++) { 
    console.log(i); 
} 

Aber in der Tat nur 10 s wird gedruckt! Der Grund, dass Funktionen in setTimeout Funktion übergeben (als "Callback-Argument) wird aufgerufen werden, nachdemfor Schleife abgeschlossen ist - dh nach i Wert bis 10.

gesetzt Doch sollten Sie eine Sache verstanden: alle JavaScript in einem Browser wird auf einem einzelnen Thread ausgeführt; asynchrone Ereignisse (wie Mausklicks und Timer) werden nur ausgeführt, wenn in der Ausführungswarteschlange eine Öffnung stattgefunden hat. Hier ist a brilliant article geschrieben von John Resig zu diesem Thema.

+5

Das Problem mit der Schleife ist ein Scoping-Problem, nicht wegen ihrer asynchronen Natur. Wenn sie korrekt ausgerichtet wären, würde die Schleife wie erwartet funktionieren. Obwohl es eine gute Erklärung der Funktionen ist, die an 'setTimout' übergeben werden, die nach der 'for'-Schleife ausgeführt werden – Ian

Verwandte Themen