Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用angularjs从异步调用中定义全局变量?_Javascript_Angularjs_Asynchronous - Fatal编程技术网

Javascript 如何使用angularjs从异步调用中定义全局变量?

Javascript 如何使用angularjs从异步调用中定义全局变量?,javascript,angularjs,asynchronous,Javascript,Angularjs,Asynchronous,我想在控制器函数外部使用单_视频变量。它在第一个控制台日志中打印良好。但是,它在控制器功能之外的第二个console.log中给出了一个未定义的错误。因为异步性 var single_video; var app = angular.module('myApp', []); app.controller('randomVideo', function($scope, $http) { var onSuccess = function(response){ $scop

我想在控制器函数外部使用单_视频变量。它在第一个控制台日志中打印良好。但是,它在控制器功能之外的第二个console.log中给出了一个未定义的错误。因为异步性

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

您可以创建一个在
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);
}

在工厂服务中定义全局变量,并在需要时将服务注入角度控制器中。(注意:试着把一切都放在生活中)

使用服务的全局变量,下面是一个示例:

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

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

您标记为“Second console.log”的实际上是第一个console.log。你所要求的是根本不可能的。“second”console.log永远不能给你这个值。@KevinB它们是一样的,但我在第二个控制台中得到一个“undefined”错误。由于异步性,在定义单_视频之前打印第二个console.log。有没有办法用回调函数等来实现这一点。我的jacascript背景很差。你必须在回调运行后访问全局变量。因此,访问全局变量的代码必须在回调中或从回调中调用。但是现在不需要全局变量了,这样看吧。该全局变量最终将包含您希望它包含的值,您只需等待它被填充后才能访问它。但是,要知道何时填充它,您需要使用一个成功回调,该回调将该值作为参数,从而使全局变量冗余。如果您在多个位置需要该值,这就是从
$http
方法返回的承诺的目的。从定义上讲,您所要求的是不可能的。你为什么不重新表述你的问题,让它揭示出你真正想解决的问题呢。异步回调后的代码管理?如果您在严格模式下定义控制器(您应该这样做!),这将不起作用。