我喜欢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})
  });
});

最佳答案

您可以使用_.zip(),它接受两个流并返回成对的流。因此,以生成ec2Instances的流为例:

var ec2InstanceStream = _(accounts)
    .map(ec2DescribeInstaces)
    .parallel(2);

_(acounts).zip(ec2InstanceStream);
    .each(function(result) {
        //Each result: [{ /* original account */ }, { /* ec2 instance */ }]
        results.push(result);
    });


因此,现在您可以将所有内容放在一起。您当然可以使其更好。例如,如果要将每对都合并为一个对象,则可以在.map(_.extend)步骤之前添加.each()以将对象合并在一起。

关于javascript - Highland.js中的上下文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29108401/

10-16 12:15