Comment async exiger que dans nodejs

J’utilise bluebird pour initier différents types de connexions à la firebase database.

// fileA.js Promise.all(allConnectionPromises) .then(function (theModels) { // then i want to do module.exports here // console.log here so the expected output module.exports = theModels }) 

Afin que je puisse exiger ce fichier ci-dessus à partir d’un autre fichier. Cependant, si je le fais, je reçois {} .

 let A = require('./fileA') // i get {} here 

Une idée comment faire ça?

Vous ne pouvez pas transformer magiquement une opération asynchrone en une opération synchrone en Javascript. Ainsi, une opération asynchrone nécessitera des techniques de codage asynchrone (rappels ou promesses). Il en va de même pour le codage normal que pour le démarrage / initialisation du module.

Le modèle de conception habituel pour traiter ce problème consiste à donner à votre module une fonction de constructeur à laquelle vous passez un rappel et lorsque vous appelez cette fonction de constructeur, il appelle le rappel lorsque le résultat asynchrone est terminé, puis tout autre code utilisant cette Le résultat async doit être dans ce rappel.

Ou, puisque vous utilisez déjà des promesses, vous pouvez simplement exporter une promesse que le code d’appel peut utiliser.

 // fileA.js module.exports = Promise.all(allConnectionPromises); 

Ensuite, dans le code qui utilise ceci:

 require('./fileA').then(function(theModels) { // access theModels here }, function(err) { console.log(err); }); 

Notez que, lorsque vous procédez ainsi, la promesse exscope sert également de cache pratique pour les theModels car chaque autre module qui en require('./fileA') recevra la même promesse et donc la même valeur résolue sans réexécuter le code derrière l’obtention des modèles.


Bien que je pense que la version de promesses est probablement plus propre, surtout que vous utilisez déjà des promesses dans le module, voici à quoi ressemblerait la version du constructeur:

 // fileA.js var p = Promise.all(allConnectionPromises); module.exports = function(callback) { p.then(function(theModels) { callback(null, theModels); }, function(err) { callback(err); }); } 

Ensuite, dans le code qui utilise ceci:

 require('./fileA')(function(err, theModels) { if (err) { console.log(err); } else { // use theModels here } });