然后捕获后分配给变量

时间:2017-11-28 17:32:39

标签: javascript angularjs web3

我在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;
};

问题在于thenbalance变量打印正确,但是在$ watchCollection中,返回undefined

问题应该是因为JS在没有等待结果的情况下继续执行,因此变量被读作undefined但是,我如何更改这两个代码片段以便在准备好和追加时获得结果它到$scope.balance

1 个答案:

答案 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))。