我正在开发一个“插件”概念,我有一系列文件,每个文件包含一个函数(一个插件)。我想使用promise.all()
自动加载和执行这些。
问题:每个插件功能都不会执行。
以下是我的示例插件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');
然后我尝试将all作为我的承诺链的一部分执行:
return Promise.all([plugins]);
该功能不会进行任何记录。有趣的是,当我记录plugins
的内容时,我看到并清空了对象:
{
"example": {}
}
有人可以建议为什么没有调用示例函数吗?
答案 0 :(得分:1)
这样做的一种方式就是跟随。假设有一个plugins
目录,其中包含pluginA.js
,pluginB.js
,...,pluginZ.js
等文件。正如您在问题中所述,这些插件的导出值始终是一个将返回承诺的函数。我会创建plugins/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))
答案 1 :(得分:0)
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
});