2015-11-23 57 views
1

我想在控制器功能之外使用single_video变量。它在第一个控制台日志中打印良好。但是它给出了single_video是第二个console.log中的未定义错误,它在控制器函数之外。由于异步性。如何从angularjs异步调用定义一个全局变量?

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

你打成什么作为*“第二console.log“*实际上是第一个console.log。你所要求的是根本不可能的。 “second”console.log将永远无法为您提供该值。 –

+0

@KevinB他们是一样的,但我得到了第二个“未定义”的错误。第二个console.log在single_video由于异步定义之前打印。有没有办法使用回调函数等等。我的jacascript背景非常差。 – Tahtakafa

+1

在回调运行后,您必须访问全局变量**。因此,访问全局变量的代码必须位于回调中或从回调中调用。但是,现在不需要全局变量了。 –

回答

1

您可以创建你的success回调传递您的变量作为参数传递给函数中调用一个函数:

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); 
     test(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); 
}); 
function test(a) 
{ 
    console.log('2nd ID='+a); 
} 
+0

如果你在严格模式下定义你的控制器(你应该是!),这是行不通的。 –

1

定义你的全局变量在工厂服务和注入服务的角度控制器,无论你需要什么。 (注意:尽量把一切都放在一个IIFE)

使用服务的全局变量,这里有一个例子:

var myApp = angular.module('myApp',[]); 
myApp.factory('MySvc', function() { 
return { 
    name : 'your name' 
}; 
}); 

,并在控制器:

function MyCtrl($scope, MySvc) { 
$scope.name = MySvc.name; 
}