2016-11-01 1 views
2

Je développe un concept de "plugins" dans lequel j'ai une série de fichiers, chacun contenant une seule fonction (un plugin). Je voudrais charger et exécuter automatiquement ceux-ci en utilisant promise.all().Node.js - charge et exécute plusieurs fonctions en utilisant Promise.all()

Problème: chaque fonction de plug-in ne s'exécute pas.

Voici mon exemple plugin plugins/example.js:

"use strict"; 

exports = function() { 
    return new Promise(function(resolve, reject) { 
     console.log("Plugin running...."); 
     setTimeout(resolve, 200, 'example plugin succeeded!'); 
    }); 
}; 

De mes app.js je puis charger tous les plugins en utilisant le module require-all NPM:

const plugins = require('require-all')(__dirname + '/plugins'); 

J'essaie alors d'exécuter tout dans le cadre de ma chaîne de promesses:

return Promise.all([plugins]); 

Aucun enregistrement n'a lieu à partir de la fonction. Il est intéressant lorsque je me connecte le contenu de plugins, je vois et objet vide:

{ 
    "example": {} 
} 

Quelqu'un peut-il dire pourquoi la fonction exemple n'est pas appelé?

+0

'plugins' est un objet avec des clés et des valeurs représentant les plugins chargés, et' promise.all' accepte un tableau de promesses, deux choses différentes – adeneo

+0

Vous n'appelez jamais * la fonction exportée, n'est-ce pas? – Bergi

Répondre

0

Le plugin RequireAll retourne un objet contenant le nom du plugin comme une clé, et l'importation comme la valeur, vous devez donc obtenir les valeurs et ensuite appeler ces fonctions pour obtenir les promesses, et puis vous auriez un tableau de promesses

const plugins = require('require-all')(__dirname + '/plugins'); 

var promises = Object.keys(plugins).map(function(key) { 
    return plugins[key](); 
}); 

Promise.all(promises).then(function() { 
    // all done 
}).catch(function(err) { 
    // fail 
}); 
+0

Fantastique - merci pour l'orientation, très utile en effet. – Ben

1

Une façon de le faire serait quelque chose comme suivre. Disons qu'il y a un répertoire plugins avec des fichiers comme pluginA.js, pluginB.js, ..., pluginZ.js. Comme vous l'avez indiqué dans votre question, la valeur exportée de ces plugins est toujours une fonction qui renverra une promesse. Je voudrais créer plugins/index.js qui exporter tout de ces plugins comme:

// plugins/index.js 
'use strict' 

const pluginA = require('./pluginA') 
const pluginB = require('./pluginB') 
... 
const pluginZ = require('./pluginZ') 

module.exports = [ pluginA, pluginB, ..., pluginZ ] 

Alors vous pouvez l'utiliser comme suit:

// foo.js 
'use strict' 

const _ = require('lodash') 
const plugins = require('./plugins') 

Promise.all(_.map(plugins, (fn) => fn())) 
.then((data) => console.log(data)) 
.catch((err) => console.log(err))