2015-11-21 239 views
-1

我想在控制器函數的外部使用single_video變量。它在第一個控制檯日誌中打印良好。但是它給出了single_video是第二個console.log中的未定義錯誤,它在控制器函數之外。我對javascript和angularjs都很窮。Javascript定義全局變量

var single_video; 
    var app = angular.module('myApp', []); 
    app.controller('randomVideo', function($scope, $http) { 
     var onSuccess = function(response){ 
      $scope.video = response.data; 
      single_video = $scope.video; 
      //First console.log 
      console.log('1st ID='+single_video.yt_id); 
     }; 
     var onError = function(reason){ 
      $scope.error = "There is an error about getting random_video.php"; 
     }; 
     $http.get("http://www.ytmdb.com/ytvideo/api/random_video.php") 
     .then(onSuccess, onError); 
    }); 
    //Second console.log 
    console.log('2nd ID='+single_video.yt_id); 
+0

它如何在第二個控制檯中打印,除非它有價值? – azad

回答

0

即使single_video被聲明,但並不限定的,即它不」已在調用第二的console.log的時間定義的任何值()。

事實上,第一個console.log的調用時間晚於第二個,因爲您只是定義了一些函數,但沒有調用它們,因此沒有設置值,所以您比第二次調用「console.log」更快。

0

你的變量沒有問題。 我想你的第二個console.log在第一個之前被調用。

你應該谷歌「JavaScript異步」或「JavaScript回調」瞭解異步代碼的工作原理。總之,當你做「$ http.get」時,你向服務器發出一個HTTP請求,服務器會在一段時間後作出響應。當服務器響應時,你的「onSuccess」被調用,並且你的變量被設置。之前沒有。

與此同時,你的第二個console.log將在初始化HTTP請求後立即執行 - 所以在服務器響應和「onSuccess」回調之前。