Préface
À mon image, asynchrone est apparue pour la première fois avec Ajax. Je travaillais toujours sur .net à ce moment-là, puis .NET a en fait publié un contrôle asynchrone ...
Bien que je savais finalement que ce n'était pas asynchrone ... alors, l'asynchrone frontal est beaucoup utilisé. S'il ne s'agit pas d'un programme asynchrone, vous êtes gêné de dire que les Nodejs que vous avez écrits ont été fabriqués par Opportunity JavaScript.
La caractéristique du modèle de programmation asynchrone a également été ramenée. Asynchronous a de nombreux avantages, mais c'est un cauchemar pour le design. L'asynchrone peut perturber le timing, il augmente donc les difficultés de conception.
Cependant, Asynchronous a révolutionné l'amélioration des performances et l'expérience utilisateur, de sorte que les caractéristiques asynchrones des NodeJ sont assez évidentes. Aujourd'hui, nous l'apprendrons simplement
E / S asynchrones
En fait, au niveau du système d'exploitation, il n'y a que deux méthodes d'E / S, bloquées et non bloquées
Dans le modèle de blocage, l'application doit attendre que les E / S se terminent avant de retourner le résultat. Sa caractéristique est que le milieu de terrain arrière est appelé pour attendre que le système termine toutes les opérations. Cela fera attendre le processeur, plutôt que de revenir immédiatement après l'appel de blocage.
Je lisais un livre quand j'étais débutant, mais je sentais qu'il n'était pas clairement décrit ici. De plus, le modèle asynchrone est en fait très important, juste une amélioration du niveau de sentiment. Laissez-moi vous donner un exemple simple
J'ai maintenant une vue d'application à une page de deux applications à une seule page. Lorsque je recherche, j'ai besoin de rechercher sur divers canaux. Shenzhen doit appeler un tiers, et le tiers obtient ensuite des données à partir de canaux spécifiques.
Bien sûr, c'est très lent à ce moment. Si je coupe directement de A à B et B pour charger des données, il n'y aura pas de problème, mais maintenant le problème est que j'ai besoin d'effets d'animation lors du passage de A à B.
Cela nécessite que le rendu BVIEW se soit terminé pendant le processus de commutation, et au moins il ne sera pas expédié au processus pour obtenir les données et commencer le rendu. Par conséquent, l'asynchrone peut ne pas être aussi facile à utiliser. Même si les données sont demandées de manière asynchrone, les données doivent être obtenues avant que la page puisse être chargée.
Ceci est toujours un chargement bloqué, il n'y a aucun moyen de le faire en affaires
Aucune technologie n'est parfaite, le blocage provoque la logique du processeur en attente de gaspillage et non bloquant les interruptions, peut également nécessiter un sondage pour confirmer si la charge est terminée (j'ai utilisé pour utiliser un sondage pour détecter si un DOM a été généré)
Nodejs adopte un mécanisme de boucle d'événements. Lorsque le processus commence, Node créera une boucle morte. Chaque processus d'exécution du corps de la boucle est une tique. Le processus de chaque tique est de voir s'il y a des événements qui doivent être traités.
S'il y en a, supprimez l'événement lié, exécutez-le, puis entrez la logique suivante. S'il n'y a pas, sortez de la boucle
Au cours de chaque processus de tick, il y a un ou plusieurs observateurs dans chaque boucle d'événements. Le processus de jugement s'il existe un événement à traiter est de demander à ces observateurs si l'événement doit être traité.
Prenez notre modèle d'événement HTML comme exemple
Pour HTML, en fait, chacun de son DOM est un observateur. Le dom de la page observe les modifications de notre page Web. Après avoir fourni un AddeventListener à un DOM, nous enregistrerons une fonction de rappel. Les événements que nous enregistrons seront placés dans un objet "conteneur". Pour le moment, ce n'est qu'un enregistrement. Ces fonctions seront déclenchées après avoir rempli les conditions (lorsque la page changera) et les événements connexes seront retirés du conteneur pour exécution.
Nous cliquons maintenant sur un point sur la page une fois, puis nous supprimerons la collection d'événements de clic dans le conteneur. Nous trouverons les DOM pertinents, puis déclencherons les fonctions de rappel de ces DOM.
Les événements peuvent provenir de clics utilisateur ou de modifications de données. Dans le nœud, les événements proviennent principalement des demandes de réseau et des E / S de fichiers. Ces événements auront des observateurs correspondants, tels que des observateurs de fichiers et des observateurs de réseau.
Il s'agit également d'un modèle de production / consommation typique, d'E / S asynchrones, de demandes de réseau pour fournir la production d'événements, les événements sont transmis à divers observateurs, les observateurs enregistrés des événements et les boucles d'événements sont responsables de l'écoute d'événements, puis d'exécuter des événements
PS: Prenez un clic comme exemple. Chaque observateur DOM enregistre d'abord l'événement, le processus de page surveille constamment la page, l'utilisateur clique sur l'événement de production de page, puis l'événement de clic enregistré est retiré du conteneur et exécuté.
La logique de fonction générale est contrôlée par nous:
La copie de code est la suivante:
var foreach = function (list, rappel) {
pour (var i = 0, len = list.length; i <len; i ++) {
rappel (list [i], i, list);
}
}
Dans le cas d'Asynchrone, la fonction de rappel n'est plus contrôlée par le développeur. Chaque fois qu'un appel JS est lancé, un objet de demande de produit de transition sera généré.
La copie de code est la suivante:
fs.open = fonction (chemin, drapeaux, mode, rappel) {
bingding.open (pathModule._MaKelong (path), stringtoflags (drapeaux), mode, rappel);
};
Fs.open ouvre un fichier basé sur le chemin d'accès et les paramètres pour obtenir des données pertinentes. L'interface liée à C ++ est appelée en interne, et un objet intermédiaire sera généré pendant le processus, et tous nos états seront inclus ...
PS: Je ne me sens pas bien après l'avoir regardé pendant si longtemps
Conclusion
Ce qui précède est tout au sujet des E / S asynchrones dans NodeJS. Résumé personnel, s'il y a des omissions ou des erreurs, veuillez les signaler.