【发布时间】:2015-03-17 19:50:10
【问题描述】:
我喜欢 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);
});
任何指导??? 所以在这条链的末端,我有来自亚马逊的实例。但我不确定如何将这些与帐户联系起来以获取名称。我知道我可以绕过这个来获得价值,但我正在寻找最佳实践和优雅的东西。
所以@Bergi,如下所示???这将返回一个“上下文”对象,其中包含我需要的数据以及从亚马逊返回的数据。我对此唯一担心的是,如果我在整个链中传递上下文,那么我们将为调用进行大量数据提取、填充和包装。
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})
});
});
【问题讨论】:
-
使用函数表达式来处理
ec2DescribeInstances周围的帐户特定的事情 -
好的,我在上面附加了一些内容以回应您的评论。这是推荐的方法吗?
-
是的,我认为这是最简单的解决方案。
标签: javascript node.js highland.js