Maison interface Web js tutoriel Méthode de gestion élégante de callback_node.js asynchrone Nodejs

Méthode de gestion élégante de callback_node.js asynchrone Nodejs

May 16, 2016 pm 04:35 PM
nodejs Manipulez avec grâce 异步回调

Avant-propos

Le plus grand point fort de Nodejs est le modèle d'E/S non bloquant et piloté par les événements, ce qui confère à Nodejs de fortes capacités de traitement simultané et est très approprié pour l'écriture d'applications réseau. La plupart des opérations d'E/S dans Nodejs sont presque asynchrones, c'est-à-dire que les résultats de nos opérations d'E/S doivent essentiellement être traités dans des fonctions de rappel, comme la fonction suivante qui lit le contenu du fichier :

Copier le code Le code est le suivant :

fs.readFile('/etc/passwd', fonction (erreur, données) {
si (erreur) lance erreur ;
console.log(données);
});

Alors, que devons-nous faire si nous lisons deux fichiers et fusionnons le contenu des deux fichiers pour le traitement ? La plupart des personnes qui ont été exposées à js pendant une courte période peuvent faire ceci :

Copier le code Le code est le suivant :

fs.readFile('/etc/passwd', fonction (erreur, données) {
si (erreur) lance erreur ;
fs.readFile('/etc/passwd2', fonction (err, data2) {
Si (erreur) lance erreur ;
// Traitez les données de data et data2 ici
});
});

Si vous faites face à plusieurs scénarios similaires, ne serait-il pas que les fonctions de rappel soient imbriquées couche par couche ? C'est ce que tout le monde appelle souvent la pyramide de rappel ou l'enfer du rappel (http://callbackhell.com/ ) est également le problème le plus gênant pour les débutants en js.

Ce type de code imbriqué pose de nombreux problèmes au développement, principalement reflétés dans :

1. La possibilité de code devient pire
2. Difficulté de débogage
3. Difficile de dépanner lorsqu'une anomalie survient

Cet article explique principalement comment gérer efficacement les problèmes de rappel asynchrone ci-dessus.

Solution de base : gérer les rappels asynchrones de manière récursive

Nous pouvons utiliser la récursivité comme outil de contrôle d'exécution de notre code. Encapsulez les opérations qui doivent être effectuées dans une fonction et contrôlez le processus d'exécution du code via des appels récursifs dans la fonction de rappel. Sans plus tarder, passons au dernier code :

.

Copier le code Le code est le suivant :

var fs = require('fs');
// Liste des fichiers à traiter
var fichiers = ['fichier1', 'fichier2', 'fichier3'];

fonction parseFile() {
si (files.length == 0) {
Retour ;
>
var fichier = fichiers.shift();
fs.readFile(fichier, fonction (erreur, données) {
// Les données du fichier sont traitées ici
ParseFile(); // Après le traitement, traitez le fichier suivant via un appel récursif
});
>

//Démarrer le traitement
parseFile();

Le code ci-dessus a traité les fichiers du tableau de manière séquentielle à titre d'exemple, introduisant la méthode récursive pour contrôler le flux d'exécution du code.

Il est bon de l'appliquer à certains scénarios simples. Par exemple, nous pouvons utiliser cette méthode pour enregistrer les données d'un tableau dans la base de données en séquence.

Certains problèmes simples de rappel asynchrone peuvent être résolus par récursivité. Cependant, il est encore quelque peu incapable de gérer des rappels asynchrones complexes (comme la nécessité de synchroniser les résultats de plusieurs opérations asynchrones).

Point magnifique : utilisez des bibliothèques tierces telles que Async, Q et Promise pour gérer les rappels asynchrones

Afin de mieux gérer le problème des rappels imbriqués, vous pouvez envisager d'utiliser certaines bibliothèques tierces spécialisées dans le traitement asynchrone. Bien sûr, si vous en avez la possibilité, vous pouvez écrire votre propre outil auxiliaire pour le traitement asynchrone.

Les bibliothèques les plus couramment utilisées pour gérer le traitement asynchrone sont : async, q et promise. À en juger par le site Web npmjs.org, async est le plus populaire. J'ai déjà utilisé async, et c'est en effet très pratique. Le flux de contrôle de divers traitements asynchrones est également très bien implémenté.

Nous utiliserons async pour traiter le code initial qui lit deux fichiers en même temps. L'exemple est le suivant :

Copier le code Le code est le suivant :

var async = require('async')
, fs = require('fs');

async.parallel([
fonction(rappel){
fs.readFile('/etc/passwd', fonction (erreur, données) {
Si (err) rappel(err);
​​ rappel(null, données);
});
},
fonction(rappel){
fs.readFile('/etc/passwd2', fonction (err, data2) {
Si (err) rappel(err);
       rappel(null, data2);
});
>
],
fonction (erreur, résultats) {
// Les données de data et data2 sont traitées ici, et le contenu de chaque fichier est obtenu à partir des résultats
});

Grâce au module async, le processus d'exécution asynchrone peut être bien contrôlé, ce qui peut également être considéré comme résolvant le problème des rappels à tous les niveaux. Le code est plus clair qu'avant, mais il est toujours indissociable de la fonction de rappel.

Réfléchissez-y, ne serait-il pas formidable si vous pouviez gérer le traitement asynchrone sans utiliser de fonctions de rappel ? Parlons ensuite de l'utilisation des nouvelles fonctionnalités d'ES6 pour atteindre cet objectif ?

Soyez élégant : adoptez ES6, remplacez les fonctions de rappel et résolvez le problème de l'enfer des rappels

On dit qu'EcmaScript Harmony (ES6) a introduit de nombreuses nouvelles fonctionnalités dans js. Les étudiants qui ne connaissent pas grand-chose à ES6 peuvent le consulter sur Baidu.

Pour utiliser les nouvelles fonctionnalités d'ES6 dans nodejs, vous devez utiliser la version v0.11.x ou supérieure.

Cet article présente l'utilisation des fonctionnalités de Generator pour remplacer les fonctions de rappel. Vous ne connaissez pas Generator ? Vous pouvez jeter un oeil ici.

Les deux modules co et thunkify sont utilisés ici. Vous pouvez les installer à l'aide de la commande npm install.

Prenons comme exemple le problème mentionné au début de cet article. L'exemple de code pour utiliser la fonctionnalité générateur est le suivant :

Copier le code Le code est le suivant :

var fs = require('fs')
, co = exiger('co')
, thunkify = require('thunkify');

var readFile = thunkify(fs.readFile);

co(fonction *() {
var test1 = rendement readFile('test1.txt');
var test2 = rendement readFile('test2.txt');
var test = test1.toString() test2.toString();
console.log(test);
})();

La gestion des exceptions dans le code est également très simple, il suffit de faire ceci :

Copier le code Le code est le suivant :

essayez {
var test1 = rendement readFile('test1.txt');
} attraper(e) {
// Gérez les exceptions ici
>

Ce code n’est-il pas beaucoup plus élégant ? N'est-il pas formidable de gérer du code asynchrone comme on écrit du code synchrone ?

Pour le développement Web dans le domaine de nodejs, le framework le plus populaire est express. Il convient de mentionner que TJ, un membre principal d'express, a dirigé un nouveau framework web-koa, qui est considéré comme le web de nouvelle génération. framework de développement. , koa profite vraiment de la fonctionnalité de générateur d'ES6, nous permettant d'éviter de tomber dans des couches de rappels lors du développement de systèmes Web.

Résumé

Citation d'une phrase de la promotion du projet fibjs : Less Callback, More Girls - Less callback, more girls

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La différence entre nodejs et vuejs La différence entre nodejs et vuejs Apr 21, 2024 am 04:17 AM

Node.js est un environnement d'exécution JavaScript côté serveur, tandis que Vue.js est un framework JavaScript côté client permettant de créer des interfaces utilisateur interactives. Node.js est utilisé pour le développement côté serveur, comme le développement d'API de service back-end et le traitement des données, tandis que Vue.js est utilisé pour le développement côté client, comme les applications monopage et les interfaces utilisateur réactives.

Nodejs est-il un framework backend ? Nodejs est-il un framework backend ? Apr 21, 2024 am 05:09 AM

Node.js peut être utilisé comme framework backend car il offre des fonctionnalités telles que des performances élevées, l'évolutivité, la prise en charge multiplateforme, un écosystème riche et une facilité de développement.

Comment connecter Nodejs à la base de données MySQL Comment connecter Nodejs à la base de données MySQL Apr 21, 2024 am 06:13 AM

Pour vous connecter à une base de données MySQL, vous devez suivre ces étapes : Installez le pilote mysql2. Utilisez mysql2.createConnection() pour créer un objet de connexion contenant l'adresse de l'hôte, le port, le nom d'utilisateur, le mot de passe et le nom de la base de données. Utilisez connection.query() pour effectuer des requêtes. Enfin, utilisez connection.end() pour mettre fin à la connexion.

Quelles sont les variables globales dans nodejs Quelles sont les variables globales dans nodejs Apr 21, 2024 am 04:54 AM

Les variables globales suivantes existent dans Node.js : Objet global : global Module principal : processus, console, nécessiter Variables d'environnement d'exécution : __dirname, __filename, __line, __column Constantes : undefined, null, NaN, Infinity, -Infinity

Quelle est la différence entre les fichiers npm et npm.cmd dans le répertoire d'installation de nodejs ? Quelle est la différence entre les fichiers npm et npm.cmd dans le répertoire d'installation de nodejs ? Apr 21, 2024 am 05:18 AM

Il existe deux fichiers liés à npm dans le répertoire d'installation de Node.js : npm et npm.cmd. Les différences sont les suivantes : différentes extensions : npm est un fichier exécutable et npm.cmd est un raccourci de fenêtre de commande. Utilisateurs Windows : npm.cmd peut être utilisé à partir de l'invite de commande, npm ne peut être exécuté qu'à partir de la ligne de commande. Compatibilité : npm.cmd est spécifique aux systèmes Windows, npm est disponible multiplateforme. Recommandations d'utilisation : les utilisateurs Windows utilisent npm.cmd, les autres systèmes d'exploitation utilisent npm.

Y a-t-il une grande différence entre nodejs et java ? Y a-t-il une grande différence entre nodejs et java ? Apr 21, 2024 am 06:12 AM

Les principales différences entre Node.js et Java résident dans la conception et les fonctionnalités : Piloté par les événements ou piloté par les threads : Node.js est piloté par les événements et Java est piloté par les threads. Monothread ou multithread : Node.js utilise une boucle d'événements monothread et Java utilise une architecture multithread. Environnement d'exécution : Node.js s'exécute sur le moteur JavaScript V8, tandis que Java s'exécute sur la JVM. Syntaxe : Node.js utilise la syntaxe JavaScript, tandis que Java utilise la syntaxe Java. Objectif : Node.js convient aux tâches gourmandes en E/S, tandis que Java convient aux applications de grande entreprise.

Nodejs est-il un langage de développement back-end ? Nodejs est-il un langage de développement back-end ? Apr 21, 2024 am 05:09 AM

Oui, Node.js est un langage de développement backend. Il est utilisé pour le développement back-end, notamment la gestion de la logique métier côté serveur, la gestion des connexions à la base de données et la fourniture d'API.

Comment déployer le projet nodejs sur le serveur Comment déployer le projet nodejs sur le serveur Apr 21, 2024 am 04:40 AM

Étapes de déploiement de serveur pour un projet Node.js : Préparez l'environnement de déploiement : obtenez l'accès au serveur, installez Node.js, configurez un référentiel Git. Créez l'application : utilisez npm run build pour générer du code et des dépendances déployables. Téléchargez le code sur le serveur : via Git ou File Transfer Protocol. Installer les dépendances : connectez-vous en SSH au serveur et installez les dépendances de l'application à l'aide de npm install. Démarrez l'application : utilisez une commande telle que node index.js pour démarrer l'application ou utilisez un gestionnaire de processus tel que pm2. Configurer un proxy inverse (facultatif) : utilisez un proxy inverse tel que Nginx ou Apache pour acheminer le trafic vers votre application

See all articles