Je fais du Javascript basé sur le Web (Vanilla JS, jQuery, Backbone, etc.) depuis quelques années maintenant, et récemment j'ai travaillé avec Node.js. Il m'a fallu un certain temps pour me familiariser avec la programmation "non bloquante", mais je me suis maintenant habitué à utiliser les rappels pour les opérations IO et ainsi de suite).
Je comprends que Javascript est un thread unique par nature. Je comprends le concept de la file d'attente d'événements Node. Ce que je ne comprends pas, c'est ce qui détermine si une opération javascript individuelle est "bloquante" par rapport à "non bloquante". Comment puis-je savoir à quelles opérations je peux me fier pour produire une sortie de manière synchrone à utiliser dans le code ultérieur, et à quelles opérations je dois passer des rappels pour pouvoir traiter la sortie une fois l'opération initiale terminée? Existe-t-il une liste de Javascript fonctionne quelque part qui sont asynchrones/non bloquants, et une liste de ceux qui sont synchrones/bloquants? Qu'est-ce qui empêche mon application Javascript d'être une condition de concurrence géante?
Je sais que les opérations qui prennent beaucoup de temps, comme IO opérations dans Node et AJAX opérations sur le Web, nécessitent qu'ils soient asynchrones et utilisent donc des rappels - mais qui détermine ce qui peut être qualifié de "longtemps"? Y a-t-il une sorte de déclencheur dans ces opérations qui les supprime de la "file d'attente d'événements" normale? Sinon, qu'est-ce qui les rend différents de des opérations simples comme assigner des valeurs à des variables ou parcourir des tableaux, sur lesquels il semble que nous pouvons compter pour terminer de manière synchrone?
Peut-être que je n'y pense même pas correctement - en espérant que quelqu'un puisse me redresser. Merci!
En général, toute fonction qui fait du réseautage ou utilise des minuteries pour faire des choses sur une période de temps sera asynchrone.
Si la fonction prend un rappel, vous pouvez voir à quoi le rappel est utilisé et il sera généralement évident qu'il est asynchrone ou non. Si la fonction n'offre pas de rappel, elle n'a aucun moyen de communiquer les résultats asynchrones, elle n'est donc probablement pas asynchrone.
Il n'y a aucun moyen infaillible de le dire avec certitude. Il doit être précisé dans le document pour une fonction ou évident d'après le fonctionnement de l'interface.
Les opérations asynchrones sont différentes sous les couvertures des opérations synchrones dans la mesure où les opérations asynchrones ont la notion de mettre en place une opération, de démarrer l'opération, puis d'être notifiées plus tard de la progression, de l'achèvement ou des erreurs dans l'opération. L'itération d'un tableau est une opération synchrone. Il n'a aucun de ces problèmes. Le code s'exécute simplement de manière synchrone. L'émission d'un appel ajax consiste à enregistrer un rappel pour les notifications d'état, puis à démarrer l'appel ajax, puis à continuer à exécuter d'autres javascript et, quelque temps plus tard, le rappel est appelé avec un changement d'état sur l'appel ajax (tel que l'achèvement).
D'après ce que je comprends, vous ne demandez pas ce que vous devrait rendre asynchrone, mais comment savoir si une fonction est asynchrone.
Vous vérifiez la documentation. Sérieusement - c'est à ça que ça sert. Vous ne devinez pas ce qu'une fonction fait en fonction de son nom ou de son contexte comme ça. Si vous n'êtes pas sûr et que vous avez accès à son code source, vérifiez-le.
C'est le seul moyen complètement fiable.
Maintenant, pour une estimation gues.
Étant donné que JavaScript est un thread unique, tous les blocs de traitement jusqu'à ce que l'un des événements suivants se produise
1) L'exécution en cours demande un service externe tel qu'une demande d'E/S ou de mise en réseau, ou une demande de webworker
2) Un appel de fonction est placé sur une minuterie pour être exécuté ultérieurement
Il n'y a pas de liste de fonctions bloquantes/non bloquantes. Vous devriez vérifier la documentation.
Votre application peut rencontrer une condition de concurrence critique si plusieurs services externes ont un verrou sur le fil javascript et tentent d'y accéder en même temps. Les navigateurs modernes et le moteur V8 gèrent cela, mais vous pouvez rencontrer cette condition de concurrence si vous utilisez PhoneGap et écrivez des applications javascript pour les appareils mobiles. Le support n'est pas là pour gérer ces conditions de course.
En général, supposez les blocs de code sauf s'il y a un rappel. Et même s'il y a un rappel, cela ne signifie pas qu'il ne se bloquera pas.