2016-03-07 5 views
0

Здесь у меня есть простое угловое приложение с двумя услугами, одно из которых получает баланс публичного адреса Dogecoin, а второй получает цену Dogecoin в Btc, из двух разных источников.Обработка данных из нескольких источников данных

Услуги:

angular.module('AppName', ['ngResource']) 

.factory('DogeBalance', ['$resource', function ($resource) { 
    return $resource("https://dogechain.info/api/v1/address/balance/:address"); 
}]) 

.factory('DogePrice', ['$resource', function ($resource) { 
    return $resource("https://chain.so/api/v2/get_info/DOGE"); 
}]) 

и контроллер:

.controller('TwoController', function($scope, DogeBalance, DogePrice){ 

    $scope.wallets = [ 
     { id: 0, type: 'doge', address: 'DT2rmMrutwzdZ8EXwzj4QFdcL6DtvGGkci'}, 
     { id: 1, type: 'doge', address: 'DMoonjyH1aHLZc1kksmikBUhjXromn1ZN4'} 
    ]; 

    var price = DogePrice.get(); 
    $scope.totalBalance = parseFloat(0); 

    price.$promise.then(function(data) { 
     $scope.price = data.data.price; 
      //aggregate balance on all the addresses 
     for (i in $scope.wallets){ 
      var balance = DogeBalance.get({address: $scope.wallets[i].address}); 
      balance.$promise.then(function(data) { 
       $scope.totalBalance += parseFloat(data.balance); 
       $scope.totalValueBtc = $scope.totalBalance * $scope.price; 
      }); 
     } 
    }); 
}); 

Мне нужно рассчитать совокупную стоимость в BTC от остатков всех dogecoin адресов из $scope.wallets. Я обработал обещания из двух вызовов api вложенным образом, как вы можете видеть в коде контроллера.

on Jsfiddle

Мой вопрос, если есть лучший способ сделать это обработку данных из нескольких обещаний?

Что делать, если у меня есть 5 обещаний до обработки данных, каждый из разных источников? Нужно ли мне помещать каждый из них в ответ на предыдущий вызов?

ответ

1

Я бы предложил поставить вашу логику в функцию, которая может быть вызвана из любого места, чтобы суммировать значение всех кошельков в массиве.

Начните с того, что баланс является частью объекта кошелька.

$scope.wallets = [ 
    { id: 0, type: 'doge', address: 'DT2rmMrutwzdZ8EXwzj4QFdcL6DtvGGkci', balance: {}}, 
    { id: 1, type: 'doge', address: 'DMoonjyH1aHLZc1kksmikBUhjXromn1ZN4', balance: {}} 
]; 

Затем вы можете сделать

$scope.getBalance = function() { 
var tempBalanace = 0; 
angular.forEach($scope.wallets, function (value, key) { 
    tempBalance += value.balance * $scope.price; 
}); 
$scope.totalBalance = tempBalance; 
}; 

Итак, теперь вы можете позвонить $ scope.getBalance() от всех ваших обещаний и общий баланс будет обновляться соответственно. Вам может потребоваться добавить дополнительную логику для обработки сценария, когда баланс или цена равны нулю (все еще ожидает ответа), но всякий раз, когда ЛЮБАЯ запись обновляется, это приведет к обновлению общего баланса с последними принятыми значениями.

Смежные вопросы