2016-11-01 6 views
2

私は、それぞれが単一の関数(プラグイン)を含む一連のファイルを持つ "プラグイン"概念を開発しています。 promise.all()を使って自動的にロードして実行したいと思います。Node.js - 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": {} 
} 

を誰が助言することはできますか?

+0

'plugins'は、読み込まれたプラグインを表すキーと値を持つオブジェクトです.' promise.all'は、約束事、2つの異なるものの配列を受け入れます。 – adeneo

+0

エクスポートされた関数を実際に呼び出すことは決してありません。 – Bergi

答えて

0

RequireAllプラグインはキーとしてプラグイン名を含むオブジェクトを返しますが、値としてインポートする必要がありますので、値を取得してから約束を得るためにこれらの関数を呼び出さなければなりません。次に約束の配列を持っています

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

素晴らしい - ガイダンスのおかげで、本当に助けになりました。 – Ben

1

これを実行する1つの方法は、次のようなものです。 pluginA.jspluginB.js、...、pluginZ.jsのようなファイルを持つpluginsディレクトリがあるとします。あなたの質問に述べたように、それらのプラグインからエクスポートされた値は、常に約束を返す関数です。そして、あなたは、次のようにこれを使用することができますので、

// plugins/index.js 
'use strict' 

const pluginA = require('./pluginA') 
const pluginB = require('./pluginB') 
... 
const pluginZ = require('./pluginZ') 

module.exports = [ pluginA, pluginB, ..., pluginZ ] 

:私は次のようにこれらのプラグインからすべてをエクスポートしplugins/index.js作成します

// 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)) 
関連する問題