In Javascript gibt es synchrone und asynchrone Funktionen.
Synchrone Funktionen
Die meisten Funktionen in Javascript sind synchron. Wenn Sie mehrere synchrone Funktionen hintereinander aufrufen würden
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
Sie werden in der richtigen Reihenfolge ausgeführt. doSomethingElse
wird nicht gestartet, bis doSomething
abgeschlossen ist. doSomethingUsefulThisTime
wird wiederum erst nach Abschluss gestartet doSomethingElse
.
Asynchrone Funktionen
Die asynchrone Funktion wartet jedoch nicht aufeinander. Schauen wir uns das gleiche Codebeispiel an, das wir oben hatten, diesmal unter der Annahme, dass die Funktionen asynchron sind
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
Die Funktionen werden der Reihe nach initialisiert, aber alle werden ungefähr zur gleichen Zeit ausgeführt. Sie können nicht konsequent vorhersagen, welches zuerst beendet wird: Dasjenige, dessen Ausführung die kürzeste Zeit in Anspruch nimmt, wird zuerst beendet.
Manchmal möchten Sie jedoch, dass asynchrone Funktionen der Reihe nach ausgeführt werden, und manchmal möchten Sie, dass synchrone Funktionen asynchron ausgeführt werden. Glücklicherweise ist dies mit Rückrufen bzw. Zeitüberschreitungen möglich.
Rückrufe
Nehmen wir an , dass wir drei asynchrone Funktionen haben , dass wir , um ausführen wollen, some_3secs_function
, some_5secs_function
, und some_8secs_function
.
Da Funktionen in Javascript als Argumente übergeben werden können, können Sie eine Funktion als Rückruf übergeben, um sie nach Abschluss der Funktion auszuführen.
Wenn wir die Funktionen so erstellen
function some_3secs_function(value, callback){
//do stuff
callback();
}
dann kannst du dann in der folgenden Reihenfolge anrufen:
some_3secs_function(some_value, function() {
some_5secs_function(other_value, function() {
some_8secs_function(third_value, function() {
//All three functions have completed, in order.
});
});
});
Zeitüberschreitungen
In Javascript können Sie einer Funktion mitteilen, dass sie nach einer bestimmten Zeitüberschreitung (in Millisekunden) ausgeführt werden soll. Dies kann dazu führen, dass sich synchrone Funktionen asynchron verhalten.
Wenn wir drei synchrone Funktionen haben, können wir sie mit der setTimeout
Funktion asynchron ausführen .
setTimeout(doSomething, 10);
setTimeout(doSomethingElse, 10);
setTimeout(doSomethingUsefulThisTime, 10);
Dies ist jedoch etwas hässlich und verstößt gegen das DRY-Prinzip [Wikipedia] . Wir könnten dies ein wenig bereinigen, indem wir eine Funktion erstellen, die ein Array von Funktionen und eine Zeitüberschreitung akzeptiert.
function executeAsynchronously(functions, timeout) {
for(var i = 0; i < functions.length; i++) {
setTimeout(functions[i], timeout);
}
}
Dies kann so genannt werden:
executeAsynchronously(
[doSomething, doSomethingElse, doSomethingUsefulThisTime], 10);
Wenn Sie über asynchrone Funktionen verfügen, die Sie synchron ausführen möchten, verwenden Sie Rückrufe. Wenn Sie über synchrone Funktionen verfügen, die Sie asynchron ausführen möchten, verwenden Sie Timeouts.