Überprüfen Sie diesen Code :
<a href="#" id="link">Link</a>
<span>Moving</span>
$('#link').click(function () {
console.log("Enter");
$('#link').animate({ width: 200 }, 2000, function() {
console.log("finished");
});
console.log("Exit");
});
Wie Sie in der Konsole sehen können, ist die Funktion "animieren" asynchron und "gabelt" den Fluss des Ereignishandler-Blockcodes. Eigentlich :
$('#link').click(function () {
console.log("Enter");
asyncFunct();
console.log("Exit");
});
function asyncFunct() {
console.log("finished");
}
Folgen Sie dem Ablauf des Blockcodes!
Wenn ich meine function asyncFunct() { }
mit diesem Verhalten erstellen möchte , wie kann ich es mit Javascript / jquery tun? Ich denke , es ist eine Strategie ohne die Verwendung von setTimeout()
javascript
jquery
function
asynchronous
markzzz
quelle
quelle
Antworten:
Sie können keine wirklich benutzerdefinierte asynchrone Funktion erstellen. Sie müssen schließlich auf eine Technologie zurückgreifen, die von Haus aus bereitgestellt wird, z.
setInterval
setTimeout
requestAnimationFrame
XMLHttpRequest
WebSocket
Worker
onload
Tatsächlich verwendet jQuery für die Animation
setInterval
.quelle
setInterval
), aber wir können sie nicht einmal öffnen, um zu sehen, wie es gemacht wird. Haben Sie zufällig weitere Informationen zu diesem Thema?setImmediate
promises
. Gibt es eineawaitable
?Sie können einen Timer verwenden:
(Wo
yourFn
ist ein Verweis auf Ihre Funktion)oder mit Lodash :
quelle
setTimeout
beträgt 4 Millisekunden gemäß HTML5-Spezifikation. Wenn Sie 0 geben, dauert dies immer noch mindestens so lange. Aber ja, es funktioniert gut als Funktionsaufschub.Hier haben Sie eine einfache Lösung (andere schreiben darüber) http://www.benlesh.com/2012/05/calling-javascript-function.html
Und hier haben Sie oben bereit Lösung:
TEST 1 ( kann '1 x 2 3' oder '1 2 x 3' oder '1 2 3 x' ausgeben ):
TEST 2 ( gibt immer 'x 1' aus ):
Diese Funktion wird mit Timeout 0 ausgeführt - sie simuliert eine asynchrone Aufgabe
quelle
console.log(1)
aufgerufen wird und output (undefined
) als zweites Argument an übergeben wirdasync()
. Im Fall von TEST 1 verstehen Sie die Ausführungswarteschlange von JavaScript meines Erachtens nicht vollständig. Da jederconsole.log()
Aufruf im selben Stapel ausgeführt wird,x
wird garantiert zuletzt protokolliert. Ich würde diese Antwort für Fehlinformationen ablehnen, aber nicht genug Repräsentanten haben.async(function() {console.log('x')}, function(){console.log(1)});
.TEST 2 as: async(function() {console.log('x')}, function(){console.log(1)});
- ich habe es bereits korrigiertHier ist eine Funktion, die eine andere Funktion übernimmt und eine Version ausgibt, die asynchron ausgeführt wird.
Es wird als einfache Möglichkeit verwendet, eine asynchrone Funktion zu erstellen:
Dies unterscheidet sich von der Antwort von @ fider, da die Funktion selbst eine eigene Struktur hat (kein Rückruf hinzugefügt, sie ist bereits in der Funktion enthalten) und auch eine neue Funktion erstellt, die verwendet werden kann.
quelle
(function(a){ asyncFunction(a); })(a)
setTimeout(asyncFunction, 0, a);
Edit: Ich habe die Frage total missverstanden. Im Browser würde ich verwenden
setTimeout
. Wenn es wichtig wäre, dass es in einem anderen Thread ausgeführt wird, würde ich Web Worker verwenden .quelle
Spät, aber um eine einfache Lösung zu zeigen, die
promises
nach ihrer Einführung in ES6 verwendet wird , werden asynchrone Anrufe viel einfacher verarbeitet:Sie legen den asynchronen Code in einem neuen Versprechen fest:
Hinweis zum
resolve()
Festlegen , wenn der asynchrone Aufruf beendet ist.Anschließend fügen Sie den Code hinzu, den Sie ausführen möchten, nachdem der asynchrone Aufruf innerhalb
.then()
des Versprechens beendet wurde:Hier ist ein Ausschnitt davon:
oder JSFiddle
quelle
Diese Seite führt Sie durch die Grundlagen der Erstellung einer asynchronen Javascript-Funktion.
Seit ES2017 sind asynchrone Javacript-Funktionen viel einfacher zu schreiben. Sie sollten auch mehr über Versprechen lesen .
quelle
Wenn Sie Parameter verwenden und die maximale Anzahl von Async-Funktionen regulieren möchten, können Sie einen einfachen Async-Worker verwenden, den ich erstellt habe:
Sie können es so verwenden:
quelle
Obwohl es sich nicht grundlegend von den anderen Lösungen unterscheidet, denke ich, dass meine Lösung ein paar zusätzliche nette Dinge tut:
Function.prototype
um eine schönere Art zu ermöglichen, es zu nennenAuch die Ähnlichkeit mit der eingebauten Funktion
Function.prototype.apply
erscheint mir angemessen.quelle
Neben der großartigen Antwort von @pimvdb und für den Fall, dass Sie sich fragen, bietet async.js auch keine wirklich asynchronen Funktionen. Hier ist eine (sehr) abgespeckte Version der Hauptmethode der Bibliothek:
Die Funktion schützt also vor Fehlern und übergibt sie ordnungsgemäß an den Rückruf, um sie zu verarbeiten. Der Code ist jedoch genauso synchron wie jede andere JS-Funktion.
quelle
Leider bietet JavaScript keine asynchrone Funktionalität. Es funktioniert nur in einem einzigen Thread. Die meisten modernen Browser bieten jedoch
Worker
s , dh zweite Skripte, die im Hintergrund ausgeführt werden und ein Ergebnis zurückgeben können. Daher habe ich eine Lösung gefunden, die meiner Meinung nach nützlich ist, um eine Funktion asynchron auszuführen, die für jeden asynchronen Aufruf einen Worker erstellt.Der folgende Code enthält die Funktion
async
zum Aufrufen im Hintergrund.Dies ist ein Beispiel für die Verwendung:
Dies führt eine Funktion aus, die a
for
mit einer großen Zahl iteriert , um sich Zeit als Demonstration der Asynchronität zu nehmen, und dann das Doppelte der übergebenen Zahl erhält. Dieasync
Methode stellt einefunction
Funktion bereit, die die gewünschte Funktion im Hintergrund aufruft, und eine Funktion, die als Parameter fürasync
Rückrufereturn
in ihrem eindeutigen Parameter bereitgestellt wird. Also in der Rückruffunktion habe ichalert
das Ergebnis.quelle
MDN hat ein gutes Beispiel für die Verwendung von setTimeout, bei dem "this" beibehalten wird.
Wie folgt:
quelle