web-dev-qa-db-fra.com

Fournir une promesse en tant qu'export d'un module est-il un modèle valide pour l'initialisation asynchrone dans Node.js?

J'ai besoin d'écrire certains modules qui chargent des données une fois, puis de fournir une interface à ces données. Je voudrais charger les données de manière asynchrone. Mon application utilise déjà des promesses. Est-ce qu'une promesse résultant de la nécessité d'un module est un modèle/idiome valide?

Exemple de module:

var DB = require('promise-based-db-module');

module.exports =
  DB.fetch('foo')
  .then(function(foo){
    return {
        getId: function(){return foo.id;},
        getName: function(){return foo.name;}
    };
  });

Exemple d'utilisation:

require('./myPromiseModule')
.then(function(dataInterface){
  // Use the data
});

METTRE À JOUR:

Je l'utilise depuis un moment maintenant et cela fonctionne très bien. Une chose que j'ai apprise, et qui est suggérée dans la réponse acceptée, est qu'il est bon de mettre en cache la promesse elle-même, et chaque fois que vous voulez accéder aux données, utilisez then. Lors du premier accès aux données, le code attendra que la promesse soit résolue. L'utilisation suivante de then renverra immédiatement les données. par exemple.

var cachedPromise = require('./myPromiseModule');
cachedPromise.then(function(dataInterface){
  // Use the data
});
...
cachedPromise.then(function(dataInterface){
  // Use the data again somewhere else.
});
28
Tony

Cela semble être une interface parfaitement bonne pour un module dont le travail consiste à effectuer une extraction unique de certaines données.

Les données sont obtenues en mode asynchrone, une promesse est donc logique. Le but est de récupérer les données une seule fois, puis de laisser à tous les endroits où ce module est utilisé l'accès aux données d'origine. Une promesse fonctionne très bien pour cela aussi car c'est un appareil à usage unique qui se souvient de son état.

Personnellement, je ne sais pas pourquoi vous avez besoin des méthodes getId() et getName() alors que vous pouvez simplement offrir un accès direct aux propriétés, mais l'une ou l'autre peut fonctionner.

Un inconvénient de cette interface est qu'il n'y a aucun moyen de demander une nouvelle copie des données (nouvellement chargées à partir de la base de données).

11
jfriend00