这里我有一个简单的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,正如您在控制器代码中看到的那样。
我的问题是,是否有更好的方法从多个承诺中执行此数据处理?
如果我在数据处理之前有5个承诺要解决,每个承诺来自不同的来源怎么办?我是否需要将它们中的每一个放在前一个的承诺回调中?
答案 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(),总余额也会相应更新。您可能需要添加一些额外的逻辑来处理余额或价格为空(仍在等待响应)的情况,但每当任何记录更新时,这将强制更新总体余额和最后收到的值。