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!