我在angularJS中有一个$ watchCollection,用于调用侦听器中的函数getBalance(addr)
。
$scope.$watchCollection('settings',
function() {
for (i = 0; i < $scope.settings['accounts'].length; i++) {
var bal = $scope.getBalance($scope.settings['accounts'][i]);
console.log(bal);
}
}
);
函数getBalance定义如下:
$scope.getBalance = function(addr) {
var balance;
if ($scope.settings.contract !== null) {
$scope.settings.contract.deployed().then(function(deployed) {
return deployed.balanceOf(addr);
}).then(function(res) {
balance = res.toNumber();
console.log(balance);
return balance;
}).catch(function(err) {
console.log(err.message);
});
}
return balance;
};
问题在于then
,balance
变量打印正确,但是在$ watchCollection中,返回undefined
。
问题应该是因为JS在没有等待结果的情况下继续执行,因此变量被读作undefined
但是,我如何更改这两个代码片段以便在准备好和追加时获得结果它到$scope.balance
。
答案 0 :(得分:0)
您似乎正在尝试更改异步代码以同步代码,这是您无法做到的。你需要在两者中一直承诺。
不是将balance
设置为变量并返回该变量,而是返回承诺本身,然后使用then
中的$watchCollection
来获取值。
$scope.$watchCollection('settings',
function() {
for (i = 0; i < $scope.settings['accounts'].length; i++) {
$scope.getBalance($scope.settings['accounts'][i])
.then(bal => console.log(bal));
}
}
);
$scope.getBalance = function(addr) {
if ($scope.settings.contract !== null) {
return $scope.settings.contract.deployed().then(function(deployed) {
return deployed.balanceOf(addr);
}).then(function(res) {
balance = res.toNumber();
console.log(balance);
return balance;
}).catch(function(err) {
console.log(err.message);
});
}
return Promise.resolve(null);
};
请注意,在返回Promises
的函数中,请确保所有路径都返回Promise
,否则会发生错误(Promise.resolve(null)
)。