105 votes

Comment empêcher Node.js de se fermer en attendant un rappel ?

J'ai un code comme celui-ci :

 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 Node se termine immédiatement lorsque je l'exécute. Il affiche 'Icanhasclient', mais aucun des fichiers console.log à l'intérieur du rappel n'est appelé.

(mysql dans cet exemple est node-mysql .

Y a-t-il quelque chose qui peut être fait pour que node.js attende la fin du rappel avant de quitter ?

45voto

Todd Points 1

Vous pouvez simplement émettre un setTimeout ou un timeout récurrent avec setInterval.

Si vous souhaitez vérifier les conditions de sortie, vous pouvez également effectuer un délai d'expiration conditionnel :

 (function wait () {
   if (!SOME_EXIT_CONDITION) setTimeout(wait, 1000);
})();

Mettez ceci à la fin de votre code et la console attendra... et attendra... jusqu'à ce que vous vouliez qu'elle se ferme.

14voto

you786 Points 1793

Ma solution consistait à instancier un EventEmitter et à écouter mon événement personnalisé.

 var eventEmitter = new process.EventEmitter();

puis j'ai appelé eventEmitter.emit depuis le rappel asynchrone :

 client.connect(function (err) {
    eventEmitter.emit('myevent', {something: "Bla"})
});

La dernière chose dans mon script était le eventEmitter.on :

 eventEmitter.on('myevent', function(myResult){
  // I needed the result to be written to stdout so that the calling process could get it
  process.stdout.write(JSON.stringify(myResult));
});

Le nœud attendra ensuite que le gestionnaire d'événements ait fini de s'exécuter.

8voto

Sur la base de la réponse de @Todd, j'ai créé un one-liner. Incluez-le au début de votre script et définissez done = true lorsque vous avez terminé :

 var done = (function wait () { if (!done) setTimeout(wait, 1000) })();

Exemple:

 var done = (function wait () { if (!done) setTimeout(wait, 1000) })();

someAsyncOperation().then(() => {
  console.log('Good to go!');
  done = true;
});

Comment ça marche? Si on développe un peu :

 // Initialize the variable `done` to `undefined`
// Create the function wait, which is available inside itself
// Note: `var` is hoisted but `let` is not so we need to use `var`
var done = (function wait () {

  // As long as it's nor marked as done, create a new event+queue
  if (!done) setTimeout(wait, 1000);

  // No return value; done will resolve to false (undefined)
})();

2voto

Voici mes deux centimes :

 async function main()
{
    await new Promise(function () {});
    console.log('This text will never be printed');
}

function panic(error)
{
    console.error(error);
    process.exit(1);
}

// https://stackoverflow.com/a/46916601/1478566
main().catch(panic).finally(clearInterval.bind(null, setInterval(a=>a, 1E9)));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X