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.js
, pluginB.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))