Un有序执行指令

时间:2014-06-15 10:30:16

标签: 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(function(data){
    angular.copy(data,users);
 });
return{
 Details:function()
    {
        alert(users);
        return users;
    }
}

2 个答案:

答案 0 :(得分:1)

您需要在$scope.user的成功回调中更新$http.get。最好的方法是在控制器中定义成功函数并将其传递给您的服务。所以你的服务就变成了:

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文件包含的内容进行调整。祝你好运。

答案 1 :(得分:0)

它会给你空用户,因为你已经定义了你的var user = []; 然后和Ajax调用,然后你返回那个用户,所以因为你不是异步地这样做,所有这些都将同步,Javascript很乐意返回一个emtpy用户:!!!

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

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

          });