处理来自多个数据源的数据

时间:2016-03-07 15:50:02

标签: javascript angularjs

这里我有一个简单的Angular应用程序,有两个服务,一个获得Dogecoin公共地址的余额,第二个获得Btc中的Dogecoin的价格,来自两个不同的来源。

服务:

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;
            });
        }
    });
});

我需要计算来自$scope.wallets的所有dogecoin地址余额的BTC总值。我以嵌套的方式处理来自两个api调用的promise,正如您在控制器代码中看到的那样。

on Jsfiddle

我的问题是,是否有更好的方法从多个承诺中执行此数据处理?

如果我在数据处理之前有5个承诺要解决,每个承诺来自不同的来源怎么办?我是否需要将它们中的每一个放在前一个的承诺回调中?

1 个答案:

答案 0 :(得分: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(),总余额也会相应更新。您可能需要添加一些额外的逻辑来处理余额或价格为空(仍在等待响应)的情况,但每当任何记录更新时,这将强制更新总体余额和最后收到的值。