Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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 指令的无序执行_Javascript_Angularjs - Fatal编程技术网

Javascript 指令的无序执行

Javascript 指令的无序执行,javascript,angularjs,Javascript,Angularjs,当我调用Details函数时,它给出的是空的细节,因为Details函数是在从json文件获取数据之前执行的。如何解决这个问题 app.controller('loginCtrl',function($scope,login){ $scope.user=login.Details(); } app.factory('login',function($cookieStore,$http){ var users=[]; $http.get("js/user.json").success(fu

当我调用Details函数时,它给出的是空的细节,因为Details函数是在从json文件获取数据之前执行的。如何解决这个问题

app.controller('loginCtrl',function($scope,login){
 $scope.user=login.Details();
}

app.factory('login',function($cookieStore,$http){
 var users=[];
 $http.get("js/user.json").success(function(data){
    angular.copy(data,users);
 });
return{
 Details:function()
    {
        alert(users);
        return users;
    }
}

当然,它会给你一个空用户,因为你已经定义了var user=[]; 然后和Ajax调用,然后您返回该用户,因为您没有异步执行此操作,所以所有这些调用都将触发同步,Javascript将很高兴返回一个emtpy用户:

有一些方法可以解决这个问题,使用承诺就是其中之一

   app.factory('login',function(){
     return{
       Details:function(){
         promise = $http.get("js/user.json");
         promise.then(function(data){
           return data;
      });
    }

   }
         });
或者您可以简单地执行以下操作:

 app.factory('login',function(){
     return{
         Details:function(){
             $http.get("js/user.json")
                 .success(function(data){
                     return data;
                 })
                       }
                }

          });

您需要在
$http.get
的成功回调中更新
$scope.user
。最好的方法是在控制器中定义success函数并将其传递到服务中。因此,您的服务变成:

app.factory('login', function($cookieStore,$http){
    var userCache;

    return {
        doLogin: function(user, password, successCallback) {
            if(!userCache) {
                $http.get("js/user.json").success(function(data) {
                    userCache = data;
                    successCallback(data);
                });
            }
        }
    }
}
您的控制器会将其添加到单击处理程序或其他内容中:

login.doLogin('sampleUsername', 'samplePassword', function(data) {
    $scope.user = data;
});
这应该可以满足您的大部分需要,您可能需要根据验证登录的方式以及示例JSON文件包含的内容进行调整。祝你好运。

可能的副本