Node.js – 使用Promise.all()加载和执行多个函数

我正在开发一个“插件”的概念,我有一系列的文件,每个文件包含一个单一的function(插件)。 我想使用promise.all()自动加载和执行这些。

问题:每个插件函数都不执行。

这里是我的例子plugin plugins/example.js

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

从我的app.js中,然后使用require-all NPM模块加载所有插件:

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

然后我尝试执行所有的作为我的承诺链的一部分:

 return Promise.all([plugins]); 

没有logging从function发生。 有趣的是,当我loginplugins的内容,我看到和空对象:

 { "example": {} } 

任何人都可以build议为什么示例函数没有被调用?

RequireAll插件返回一个包含插件名称作为关键字的对象,并将导入作为值返回,所以您必须获取这些值,然后调用这些函数来获得承诺, 然后才能得到一组promise

 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 }); 

做这件事的一种方法就是跟随。 让我们说有一个pluginA.jspluginB.js ,…, pluginZ.js文件的plugins目录。 正如你在你的问题中所述,从这些插件导出的值总是一个函数,将返回一个承诺。 我会创buildplugins/index.js ,将导出从这些插件的一切,如:

 // plugins/index.js 'use strict' const pluginA = require('./pluginA') const pluginB = require('./pluginB') ... const pluginZ = require('./pluginZ') module.exports = [ pluginA, pluginB, ..., pluginZ ] 

那么你可以使用这个如下:

 // 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))