Was bestimmt, welche Javascript-Funktionen blockieren oder nicht blockieren?

27

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!

Sean
quelle
Dies ist etwas, das ich für sehr nützlich befunden habe, obwohl Sie auf Ihre Frage antworten, dass Sie die Dokumentation überprüfen müssen, um herauszufinden, ob die Methoden asynchron sind.
Anastasios Andronidis

Antworten:

13

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).

jfriend00
quelle
1
Zusätzlich sind einige Javascript-Funktionen abhängig von ihren Parametern blockierend und nicht blockierend. Hat beispielsweise XMLHttpRequest.openeinen booleschen asyncParameter, der steuert, ob der spätere Aufruf von sendasynchron ist.
Brian
Ich fand diese Antwort einfach nicht hilfreich und erklärte sie allgemein.
Mehdi Raash
@ MehdiRaash - Die Antwort ist, dass Sie es aus der Dokumentation oder von der Schnittstelle herausfinden. Es geht nicht anders. Das sagt dieser. Nicht sicher, was Sie erwartet hatten. Es gibt keine magische Antwort.
jfriend00
6

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.

  • Wenn es einen Rückruf annimmt oder ein Versprechen zurückgibt, ist es wahrscheinlich asynchron (ich habe Ausnahmen für diese Regel gesehen)
  • Im Allgemeinen erfolgt alles, was mit E / A in node.js und allgemeiner in JavaScript zu tun hat, asynchron (ich habe auch Ausnahmen von dieser Regel gesehen).
Benjamin Gruenbaum
quelle
4

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.

Kodierer
quelle
-1

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:

Alle E / A-Methoden in der Standardbibliothek von Node.j bieten nicht blockierende asynchrone Versionen und akzeptieren Rückruffunktionen. Einige Methoden haben auch blockierende Gegenstücke, deren Namen mit Sync enden.

TaborKelly
quelle
1
Wie geht das auf die gestellte Frage ein? Sehen Sie, wie man antwortet
Mücke