2017-02-03 4 views
3

Ich versuche einfach, den Balance-Wert eines Ethereum-Kontos mit dem web3 api zurückzugeben, ich möchte diesen Wert im $ scope erhalten, damit ich ihn verwenden kann mein HTML. Leider bekomme ich immer einen Wert undefiniert. Ich vermute, es kommt von der Tatsache, dass Web3 asynchron sein könnte, aber ich bin mir nicht sicher. Hier ist mein Code:

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

Grundsätzlich ist die console.log („Dies ist innen“) arbeitet, und ich tue den richtigen Wert erhalten. Aber die console.log („Das ist außerhalb“) nicht und ich bekomme einen nicht definierten Wert ...

+1

Ich weiß nicht, was web3.eth.getBalance ist, aber ich nehme an, es ist ein Versprechen. Wenn dies der Fall ist, wird der Code in der Callback-Funktion nicht ausgeführt, bis das Versprechen gelöst ist. Währenddessen wird der andere Code weiter ausgeführt. Sie können dies sehen, wenn Sie während der Ausführung durch den Code gehen – jbrown

Antwort

2

Unfortunatly immer bekomme ich einen Wert nicht definiert ist. Ich vermute, es ist kommt aus der Tatsache, dass Web3 asynchron sein könnte, aber ich bin nicht sicher.

Sie haben es erraten.

hier:

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

die Funktion (err, res) ist die Callback-Funktion ausgeführt, wenn die getBalance() Funktion seine Aufgabe beendet hat.
Eine Callback-Funktionsdeklaration blockiert nicht. Es wird nur ausgeführt, wenn die aufgerufene Funktion ihre Aufgabe beendet hat und so ein Versprechen zurückgibt, das es ermöglicht, die Callback-Funktion aufzurufen, um ihren Aufrufer über das Ergebnis der Aufgabe zu informieren. So
wenn getBlance() Funktion aufgerufen wird, wird der nächste ausgeführte Code ist:

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

Aber zu diesem Zeitpunkt hat sich die Callback-Funktion noch nicht aufgerufen worden.
Nur wenn die Callback-Funktion aufgerufen wird, wird $scope.balance = res.c[0] ausgeführt.

Fazit:

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