Ich mache jetzt seit ein paar Jahren webbasiertes Javascript (Vanilla JS, jQuery, Backbone usw.) und arbeite seit kurzem mit Node.js. Es hat eine Weile gedauert, bis ich mich mit der "nicht blockierenden" Programmierung vertraut gemacht habe, aber jetzt habe ich mich daran gewöhnt, Rückrufe für E / A-Operationen und so weiter zu verwenden.
Ich verstehe, dass Javascript von Natur aus Single-Threaded ist. Ich verstehe das Konzept des Knotens "Ereigniswarteschlange". Was ich NICHT verstehe, ist, was bestimmt, ob eine einzelne Javascript-Operation "blockiert" oder "nicht blockiert". Woher weiß ich, auf welche Vorgänge ich mich verlassen kann, um synchron eine Ausgabe für den späteren Code zu erstellen, und an welche muss ich Rückrufe senden, damit ich die Ausgabe nach Abschluss der ersten Operation verarbeiten kann? Gibt es eine Liste von Javascript-Funktionen, die asynchron / nicht blockierend sind, und eine Liste von Funktionen, die synchron / blockierend sind? Was hindert meine Javascript-App daran, eine riesige Rennbedingung zu sein?
Ich weiß, dass Vorgänge, die lange dauern, wie E / A-Vorgänge in Node- und AJAX-Vorgängen im Web, eine Asynchronität erfordern und daher Rückrufe verwenden - aber wer bestimmt, was als "lange Zeit" bezeichnet wird? Befindet sich in diesen Vorgängen eine Art Auslöser, der sie aus der normalen "Ereigniswarteschlange" entfernt? Wenn nicht, was unterscheidet sie von einfachen Operationen wie dem Zuweisen von Werten zu Variablen oder dem Durchlaufen von Arrays, auf die wir uns anscheinend verlassen können, um synchron zu beenden?
Vielleicht denke ich gar nicht richtig darüber nach - in der Hoffnung, dass mich jemand klarstellen kann. Vielen Dank!
Antworten:
Im Allgemeinen ist jede Funktion, die über einen bestimmten Zeitraum hinweg Netzwerkfunktionen ausführt oder Timer verwendet, asynchron.
Wenn die Funktion einen Rückruf annimmt, können Sie sich ansehen, wofür der Rückruf verwendet wird, und in der Regel wird klar, ob er asynchron ist oder nicht. Wenn die Funktion keinen Rückruf anbietet, kann sie keine asynchronen Ergebnisse übermitteln, sodass sie wahrscheinlich nicht asynchron ist.
Es gibt keinen sicheren Weg, es zu sagen. Es muss entweder im Dokument für eine Funktion angegeben werden oder anhand der Funktionsweise der Benutzeroberfläche ersichtlich sein.
Asynchrone Operationen unterscheiden sich von synchronen Operationen darin, dass asynchrone Operationen den Begriff haben, eine Operation einzurichten, die Operation zu starten und später über Fortschritt, Abschluss oder Fehler in der Operation benachrichtigt zu werden. Das Iterieren eines Arrays ist eine synchrone Operation. Es hat keines dieser Probleme. Der Code läuft nur synchron. Das Ausgeben eines Ajax-Aufrufs besteht aus dem Registrieren eines Rückrufs für Statusbenachrichtigungen, dem Starten des Ajax-Aufrufs, dem Fortsetzen der Ausführung von anderem Javascript und dem späteren Aufrufen des Rückrufs mit einer Statusänderung beim Ajax-Aufruf (z. B. Abschluss).
quelle
XMLHttpRequest.open
einen booleschenasync
Parameter, der steuert, ob der spätere Aufruf vonsend
asynchron ist.Soweit ich weiß, fragen Sie nicht, was Sie asynchron machen sollen, sondern wie Sie feststellen können, ob eine Funktion asynchron ist.
Sie überprüfen die Dokumentation. Im Ernst - dafür ist es da. Sie ahnen nicht, was eine Funktion aufgrund ihres Namens oder ihres Kontexts tut. Wenn Sie sich nicht sicher sind und Zugriff auf den Quellcode haben, überprüfen Sie dies.
Das ist der einzige absolut zuverlässige Weg.
Nun zum Abschätzen.
quelle
Da JavaScript Single-Threaded ist, alle Verarbeitungsblöcke, bis einer der folgenden auftritt
1) Die aktuelle Ausführung fordert einen externen Dienst an, z. B. eine E / A- oder Netzwerkanforderung oder eine Webworker-Anforderung
2) Ein Funktionsaufruf wird auf einen Timer gelegt, um zu einem späteren Zeitpunkt ausgeführt zu werden
Es gibt keine Liste blockierender / nicht blockierender Funktionen. Sie sollten die Dokumentation überprüfen.
Ihre App kann auf einen Race Condition stoßen, wenn mehrere externe Dienste den JavaScript-Thread sperren und gleichzeitig versuchen, darauf zuzugreifen. Moderne Browser und die V8-Engine bewältigen dies, aber wenn Sie Phonegap verwenden und Javascript-Apps für Mobilgeräte schreiben, kann dies zu Problemen führen. Der Support ist nicht da, um diese Rennbedingungen zu meistern.
Nehmen Sie im Allgemeinen die Codeblöcke an, es sei denn, es gibt einen Rückruf. Und selbst wenn es einen Rückruf gibt, heißt das nicht, dass er nicht blockiert.
quelle
Ich bin auch neu in node.js (und JavaScript im Allgemeinen) und ich bin nicht an so viel asynchronen Code gewöhnt. Ich wollte nur darauf hinweisen, dass in der Übersicht von Blocking vs Non-Blocking auf nodejs.org Folgendes angegeben ist:
quelle