0

我在 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.

4

1 回答 1

0

看起来您正在尝试将异步代码更改为同步代码,而您实际上无法做到。你需要在这两个方面一直兑现承诺。

与其设置balance一个变量并返回该变量,不如返回 Promise 本身,然后使用thenin your$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,请确保所有路径都返回 aPromise或将发生不好的事情(因此是Promise.resolve(null))。

于 2017-11-28T17:37:24.050 回答