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

Node.js - load and execute multiple functions using Promise.all()

我正在开发一个 "plugins" 概念,其中我有一系列文件,每个文件包含一个函数(插件)。我想使用 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');

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

return Promise.all([plugins]);

该函数不进行任何日志记录。有趣的是,当我记录 plugins 的内容时,我看到了空对象:

{
    "example": {}
}

谁能告诉我为什么没有调用示例函数?

一种方法如下。假设有一个 plugins 目录,其中包含 pluginA.jspluginB.js、...、pluginZ.js 等文件。正如您在问题中所述,从这些插件导出的值始终是一个 return 承诺的函数。我会创建 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))

RequireAll 插件 returns 包含插件名称作为键、导入作为值的对象,因此您必须获取值,然后调用这些函数来获取承诺,并且然后你会有一系列的承诺

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