2017-02-03 11 views
3

Я просто пытаюсь вернуть значение Баланса учетной записи ethereum с помощью 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, но я предполагаю, что это обещание. Если это так, код в функции обратного вызова не будет выполняться до тех пор, пока обещание не будет разрешено. Между тем, другой код продолжает выполняться. Вы можете увидеть это, если вы выполните код во время его выполнения – jbrown

ответ

2

Unfortunatly я всегда получаю значение не определено. Я подозреваю, что это , исходя из того факта, что 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, разреш) является функция обратного вызова выполняется, когда функция getBalance() завершила свою задачу.
Объявление функции обратного вызова не блокирует. Он выполняется только в том случае, когда вызываемая функция завершила свою задачу и поэтому возвращает обещание, которое позволяет вызвать функцию обратного вызова, чтобы уведомить вызывающего объекта о результате задачи.
Поэтому, когда getBlance() вызывается функция, следующий выполняется код:

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

Но в это время, функция обратного вызова не вызывается еще.
Это происходит только тогда, когда вызывается функция обратного вызова, что выполняется $scope.balance = res.c[0].

Вывод:

вы должны удалить console.log("This is outside:" + $scope.balance);.

 Смежные вопросы

  • Нет связанных вопросов^_^