2017-02-03 15 views
3

私は単にweb3 APIを使用してethereumアカウントの残高の値を返そうとしていますが、私は$ scopeでその値を取得したいと思います。私のHTML。不幸にも私はいつも価値が得られないということは決まっていません。 Web3が非同期であるかもしれないという事実から来ていると思われますが、わかりません。

app.controller('mainController', function ($scope) { 
    $scope.showBalance = function(){ 
     web3.eth.getBalance("0xCc26fda641929192B2Fe96BBc37DB5B451Cb9A8c", 
      function(err, res){ 
       $scope.balance = res.c[0] 
       console.log("This is inside:" + $scope.balance); 
      }); 

     console.log("This is outside:" + $scope.balance); 
    }; 

    angular.element(document).ready(function() { 
     $scope.showBalance(); 
    }); 
}); 

基本的にはconsole.log(「これは内部である」)で動作し、私は右の値を取得し実行します。ここに私のコードです。 console.log( "This is outside")は、未定義の値を取得しません。

+1

私はweb3.eth.getBalanceが何であるか分かりませんが、私はそれを約束します。その場合、コールバック関数のコードは、約束が解決されるまで実行されません。一方、もう一方のコードは引き続き実行されます。実行中にコードをステップ実行すれば、これを見ることができます – jbrown

答えて

2

不幸にも私はいつも値が不定です。私はそれが web3が非同期かもしれないという事実から来ていると思うが、私は ではない。

あなたは推測しました。ここ

web3.eth.getBalance("0xCc26fda641929192B2Fe96BBc37DB5B451Cb9A8c", 
     function(err, res){ 
      $scope.balance = res.c[0] 
      console.log("This is inside:" + $scope.balance); 
     }); 

    console.log("This is outside:" + $scope.balance); 

関数(ERR、RES)getBalance()関数はそのタスクを終了したときに実行されるコールバック関数です。
コールバック関数の宣言がブロックされていません。呼び出された関数がタスクを終了し、コールバック関数を呼び出して呼び出し元にタスクの結果を通知できるようにするという約束を返すときにのみ実行されます。
getBlance()関数が呼び出されたときに、次に実行コードは次のとおりです。

console.log("This is outside:" + $scope.balance);. 

しかし、この時点では、コールバック関数はまだ呼び出されていません。
これは、 $scope.balance = res.c[0]が実行されるコールバック関数が呼び出されたときだけです。

結論:

あなたがconsole.log("This is outside:" + $scope.balance);を削除する必要があります。