Node.js - 使用Promise.all()

时间:2016-11-01 18:11:59

标签: node.js promise anonymous-function es6-promise

我正在开发一个“插件”概念,我有一系列文件,每个文件包含一个函数(一个插件)。我想使用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": {}
}

有人可以建议为什么没有调用示例函数吗?

2 个答案:

答案 0 :(得分:1)

这样做的一种方式就是跟随。假设有一个plugins目录,其中包含pluginA.jspluginB.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
});