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

問題はthen、 ではbalance変数が正しく出力されますが、$watchCollection では戻り値がundefined.

問題は、JS が結果を待たずに実行を続けるため、変数が次のように読み取られるためです。undefinedただし、準備ができたら結果を取得して に追加するには、これら 2 つのコード スニペットを変更する必要があります$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すべての経路が a を返すことを確認してください。そうしPromiseないと、悪いことが起こります (したがってPromise.resolve(null))。

于 2017-11-28T17:37:24.050 に答える