Heim > Artikel > Web-Frontend > Wie gehe ich mit asynchronen Funktionen innerhalb von JavaScript-For-Schleifen richtig um?
Beim Arbeiten mit asynchronen Funktionen innerhalb einer JavaScript-for-Schleife können Probleme im Zusammenhang mit der asynchronen Ausführung und dem Variablenbereich auftreten.
Betrachten Sie den folgenden Code:
for (var i = 0; i < list.length; i++) { mc_cli.get(list[i], function (err, response) { do_something(i); }); }
In diesem Beispiel ist mc_cli.get eine asynchrone Funktion, die die Rückruffunktion aufruft, wenn der Vorgang abgeschlossen ist. Da der Rückruf jedoch asynchron ist, kann er ausgeführt werden, nachdem die for-Schleife bereits beendet wurde, was möglicherweise zu fehlerhaftem Verhalten führt.
Ein weiteres Problem tritt auf, wenn die Funktion „do_something“ innerhalb des Rückrufs verwendet wird. Da die Variable i eine Schleifenvariable ist, ändert sich ihr Wert während der Ausführung der Schleife. Daher verwendet do_something(i) immer den letzten Wert von i in der Schleife, was nicht das gewünschte Verhalten ist.
Um diese Probleme zu lösen, ist ein gängiger Ansatz die Verwendung von Abschlüssen. Mit Abschlüssen können Sie einen neuen Bereich um eine Variable erstellen und so sicherstellen, dass ihr Wert während des gesamten asynchronen Vorgangs konsistent bleibt. Im bereitgestellten Beispiel sind die Abschlüsse jedoch nicht korrekt implementiert.
Eine korrekte Implementierung wäre, eine interne Funktion innerhalb der Schleife zu erstellen, die Zugriff auf den aktuellen Wert von i hat:
for (var i = 0; i < list.length; i++) { (function (i) { mc_cli.get(list[i], function (err, response) { do_something(i); }); })(i); }
In diesem Fall hat die interne Funktion ihren eigenen Gültigkeitsbereich und kann über die äußere Schleife auf den Wert von i zugreifen. Es ist jedoch wichtig zu beachten, dass die äußere Schleife abgeschlossen sein muss, bevor mc_cli.get aufgerufen wird, da andernfalls weiterhin Probleme auftreten können.
Alternativ können Sie die forEach-Methode für das Array verwenden, die das Listenelement bereitstellt und den Index im Rückruf, wodurch Abschlüsse vollständig überflüssig werden:
list.forEach(function (listItem, index) { mc_cli.get(listItem, function (err, response) { do_something(index); }); });
Das obige ist der detaillierte Inhalt vonWie gehe ich mit asynchronen Funktionen innerhalb von JavaScript-For-Schleifen richtig um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!