Я люблю Highland.js и стиль реактивного программирования в целом. Я борюсь с потерей контекста, и я пытаюсь определить, как элегантно обрабатывать контекст в модели, где целью является отказ от состояния.Контекст в 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, мы будем делать цикл здесь, поэтому, когда мы делаем каждый вызов ec2Des cribeInstances, контекст будет существовать
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})
});
});
использовать выражение функции, которое делает специфичные для учетной записи вещи вокруг 'ec2DescribeInstances' – Bergi
Хорошо, я добавил что-то выше в ответ на ваш комментарий. Это рекомендуемый подход? –
Да, я думаю, это самое простое решение. – Bergi