2016-03-07 58 views
0

在這裏,我有一個簡單的Angular應用程序,它有兩個服務,一個從兩個不同的來源獲得一個狗舍幣公共地址的餘額,另一個在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; 
      }); 
     } 
    }); 
}); 

我需要從$scope.wallets計算BTC所有多吉幣地址的餘額的合計值。我以嵌套的方式處理來自兩個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()。您可能需要添加一些額外的邏輯來處理餘額或價格爲空(仍在等待響應)的情況,但每當更新任何記錄時,都會強制更新最後收到的值的整體餘額。