Comment prévenir Node.js à partir de la sortie lors de l'attente d'un rappel?
J'ai un code comme ceci:
var client = new mysql.Client(options);
console.log('Icanhasclient');
client.connect(function (err) {
console.log('jannn');
active_db = client;
console.log(err);
console.log('hest');
if (callback) {
if (err) {
callback(err, null);
}
callback(null, active_db);
}
});
Mon problème est que le Nœud se termine immédiatement quand je le lance. Il imprime 'Icanhasclient", mais aucun de la console.le journal est à l'intérieur de la fonction de rappel est appelée.
(mysql dans cet exemple est nœud-mysql.
Est-il quelque chose qui peut être fait pour rendre node.js attendre le rappel pour terminer avant de quitter?
- qu'entendez-vous prévenir de la sortie? Nodejs n'existent pas jusqu'à ce que tous les rappels sont terminés. C'est un thread unique processus.
- Si c'était le cas, pourquoi mon script de sortie sans l'exécution de la fonction de rappel?
- C'est un problème de connexion à votre base de données; je ne suis pas trop sûr de savoir pourquoi il n'est pas de tir à la fonction de rappel. Ne donner aucune erreur?
- Non, il a juste échoue silencieusement 🙁
- C'est très bizarre. J'espère que nous allons trouver une réponse à cela.
- Je suis très en retard, mais pour ceux qui viennent de Google, j'ai ajouté un one-liner réponse: stackoverflow.com/a/50451612/938236
Vous devez vous connecter pour publier un commentaire.
De rappel n'est Pas mis en file d'Attente
Nœud s'exécute jusqu'à ce que tous les cas files d'attente sont vides. Un rappel est ajouté à un événement file d'attente lorsqu'un appel comme
a exécuté. Cet appel fait partie du code écrit par le développeur de modules .
Si un module est un port rapide d'une synchrone/blocage de version, cela ne peut pas arriver jusqu'à une certaine partie de l'opération est terminée et que toutes les files d'attente pourraient vide avant que se produit, permettant nœud de sortie silencieusement.
C'est un bug sournois, c'est que le module développeur peut ne pas fonctionner en cours de développement, car il va se produire moins souvent dans les systèmes avec de nombreux files d'attente comme il sera rare pour tous d'être vide au moment critique.
Un éventuel correctif bug/détecteur pour l'utilisateur d'insérer un spécial événement de minuterie avant que le suspect appel de fonction.
EventEmitter.on()
n' pas ajouter quoi que ce soit sur la boucle d'événement de ce Nœud va attendre (au moins dans la version actuelle de Nœud). Semble que des choses comme le réglage des délais d'attente et de prise d'appels asynchrones à partir de la bibliothèque de base peuvent le faire. Vous pouvez le tester facilement par écrit une seule ligne de programme qui attend un événement qui se déclenche jamais. À partir de cette réponse, vous vous attendez à ne jamais mettre fin, mais il t mettre fin instantanément. Voir cette réponse pour plus d'info.Vous pouvez simplement émettre un setTimeout ou récurrence d'un délai d'attente avec setInterval.
Si vous souhaitez vérifier les conditions de sortie, vous pouvez également faire un conditionnel délai d'attente:
Mettre ceci à la fin de votre code et la console va juste attendre ... et attendre ... jusqu'à ce que vous souhaitez fermer.
Ma solution a été d'instancier un EventEmitter, et d'écouter mon événement personnalisé.
alors j'ai appelé
eventEmitter.emit
de la async rappel:La dernière chose dans mon script était le
eventEmitter.on
:Nœud, puis attendez jusqu'à ce que le gestionnaire d'événement de la fin de l'exécution.
EventEmitter
classe est définie par laevents
module. Ainsi, pour créer un nouvel émetteur:const EventEmitter = require('events'); var eventEmitter = new EventEmitter()
.Basé sur @Todd réponse, j'ai créé un one-liner. L'inclure dans le début de votre script, et de définir
done = true
lorsque vous avez terminé:Exemple:
Comment ça fonctionne? Si l'on développe un peu:
Voici mes deux cents:
J'ai regardé felixge/node-mysql de la bibliothèque et de ne pas voir une référence à la commande client.se connecter à l'API. Est-ce de l'appel que vous essayez de faire (ne pas essayer d'être tâtillon ici)? Peu importe, à mon humble avis vous avez besoin de réfléchir sur la manière dont le Javascript est conçu, car il utilise un paradigme de programmation différent de la plupart des autres langues populaires.
Le premier problème que je vois dans ton code, c'est que vous n'avez pas défini la fonction de rappel, il n'existe pas réellement. Je suppose que la console.log(rappel) n'est pas défini. À partir de votre code, la fonction anonyme est le "rappel" pour le client.fonction de connexion. Vous devez définir ce que vous appelez 'callback' à une portée plus élevée. Par exemple, je vais définir une fonction myCallback d'exister dans le champ plus élevé que le client.connecter la fonction anonyme. Il peut être utile pour la recherche de Javacscript la portée des variables.
Deuxièmement, si vous n'appelez pas explicitement de retour au sein de Javascript, la fonction continue. J'ai été mordu par cette moi-même. Enfin, le Javascript s'exécute une event-driven boucle sens il ne sera jamais à attendre pour les fonctions pour retourner une valeur, c'est pourquoi nous avons tous ces rappels, en premier lieu. Vous pouvez forcer Javascript à se comporter différemment, par exemple en utilisant une boucle while jusqu'à ce qu'une condition est vraie. Voir le "asynchrone" bibliothèque par caolan, pour différentes stratégies de manipulation de la boucle d'événements. L'inconvénient majeur de la surutilisation de ces méthodes est de votre fait perdre de cycles CPU/bloquer lorsque vous devriez probablement utiliser plus de rappels et tout simplement de repenser la façon dont vos programmes de travaux.
S'il vous plaît essayer cette. Vérifier si cette aide.