私は Highland.js とリアクティブ プログラミングのスタイル全般が大好きです。私はコンテキストの喪失に苦しんでおり、状態を放棄することが目標であるモデルでコンテキストをエレガントに処理する方法を決定しようとしています。
例として、Amazon Web Services に自分のアカウントの配列があります。
var accounts = [{accessId:"12345","secretKey":"abc123","account":"foo"},
{accessId:"34512","secretKey":"def456","account":"bar"}];
私の目標は、基本的に、リージョンで実行されているすべての EC2 インスタンスのスプレッドシートを作成することです。このようなもの。
Account | Instance Size
--------- | -------------
foo | m3.xlarge
foo | c3.medium
bar | t2.small
一般的なワークフローは次のようになります。
- 各アカウントを通過する
- ec2DescribeInstaces を呼び出す
- どういうわけか、各 ec2DescribeInstances コールを最終出力のアカウント名にマップします
通常の JavaScript では、ここでループを行うため、ec2DescribeInstances を呼び出すたびにコンテキストが存在します。
for ( account in accounts ) {
var instances = ec2DescribeInstaces(account);
for ( instance in instances ) {
results.push({account:account.name, instanceSize: instance.size});
}
}
リアクティブプログラミングで私が理解していることから、私はこのようなことをします
_(accounts)
.map(ec2DescribeInstaces)
.parallel(2)
.each(function(result) {
results.push(result);
});
任意のガイダンス??? このチェーンの最後に、Amazon からのインスタンスがあります。しかし、それらをアカウントに関連付けて名前を取得する方法がわかりません。これをハックして値を取得できることはわかっていますが、ベストプラクティスとエレガントなものを探しています。
@Bergi、以下のように??? これは、必要なデータと Amazon から返されたデータの両方を含む「コンテキスト」オブジェクトを返すことが不可欠です。これに関する私の唯一の懸念は、チェーン全体でコンテキストを渡すと、呼び出しのために多くのデータの抜き取り、詰め込み、およびラッピングを行うことになるということです。
ec2DescribeInstances = _.wrapCallback(function(accountData, callback) {
// we remove the extraneous account name using a pick
var ec2 = new AWS.EC2(lodash.pick(accountData,'accessKeyId','secretAccessKey'));
ec2.describeInstances({ Filters: [{Name:'instance-state-name', Values:['running']}] }, function(err,data) {
if ( err ) return callback(err);
// here I create an object that wraps the AWS response
callback(null, {"account":accountData.alias, "data": data})
});
});