使用$ http时控制器和工厂调用顺序不同?

时间:2016-06-23 10:54:26

标签: angularjs

我想创建一个简单的登录,所以我刚创建了一个包含用户名和密码的html页面。我创建了一个控制器并调用了一个名为login的函数,在里面我调用了一个返回工厂数据的工厂,我会根据这些数据创建登录。

控制器

myApp.controller('login', ['$scope','$rootScope', '$location', '$window', 'authenticate', '$http', '$cookieStore',function($scope, $rootScope, $location, $window, authenticate, $http, $cookieStore) {
$scope.alert = '';
$scope.login = function(){
    authenticate.login($scope.login.username, $scope.login.password).then(function(response){
        alert("Inside controller"+JSON.stringify(response));
    });
}
}]);

我的工厂

myApp.factory('authenticate',['$http', '$filter', '$cookieStore', '$rootScope', '$window', '$q',
function($http, $filter, $cookieStore, $rootScope, $window, $q) {
    var data = "";
    var deferred = $q.defer();
    return {
        login: function(userName,password){
            $http.post('user/serverside/authentication.php',{username: userName, password: password})
            .then(function(response){
                deferred.resolve(response.data);
                alert("FACTORY"+JSON.stringify(response));
            });
            return deferred.promise;
        }
    }
}]);

我在登录时调用控制器内的登录功能, 问题是我登录时

  • 第一次将一个数据作为预期的第一个警报在工厂内 执行,然后执行控制器内的警报。
  • 但第二次警告内部控制器执行第一次和 工厂警报显示,

质疑

  1. 为什么执行顺序第二次改变?
  2. 这是一种正确的登录方式,如果有更好的方法请 提示?

1 个答案:

答案 0 :(得分:2)

我认为它的错误因为你应该在每个功能中产生承诺,而不是在主工厂中产生承诺:

myApp.factory('authenticate',['$http', '$filter', '$cookieStore', '$rootScope', '$window', '$q',
function($http, $filter, $cookieStore, $rootScope, $window, $q) {
    var data = "";

    return {
        login: function(userName,password){
            var deferred = $q.defer();
            $http.post('user/serverside/authentication.php',{username: userName, password: password})
            .then(function(response){
                deferred.resolve(response.data);
                alert("FACTORY"+JSON.stringify(response));
            });
            return deferred.promise;
        }
    }
}]);

Ur代码不起作用,因为承诺首次执行生成的代码,如果代码已经检查,则承诺其解析会自动执行然后阻止。

2.-您可以使用ssl来登录您的登录,但该功能登录类似。重要的是它在服务器端的实现。