2017-02-03 61 views
3

我只是試圖使用web3 api返回以太坊帳戶的餘額值,我希望在$ 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(「這是外」)沒有,我得到一個未定義的值...

+1

我不知道web3.eth.getBalance是什麼,但我認爲它是一個承諾。如果是這樣,那麼回調函數中的代碼將不會被執行,直到promise被解析。同時,其他代碼繼續執行。如果您在執行代碼時逐步完成代碼,您可以看到這一點 – 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);