为什么我只能通过添加.success来执行$ http函数?

时间:2014-12-09 19:26:06

标签: javascript angularjs angular-promise angular-http

我创建了一个返回$http承诺的工厂。

loginRsrc.factory('loginSrvc', ['$http', function($http){

    var http = $http({
        method: 'POST',
        url: "http://myproj.herokuapp.com/api/signIn",
        data: $.param({email: "joe@gmail.com", password: "1234567"}),
        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    });

    return http;

我在控制器中使用这个工厂。但我的行为很有趣。

当我说

loginSrvc()
        .success(function(res){
            console.log("res:");
            console.log(res);
        })
        .error(function(res){
            console.log("res");
            console.log(res);
        });

我收到TypeError: object is not a function

的错误

但是当我说(省略括号)时

loginSrvc
        .success(function(res){
            console.log("res:");
            console.log(res);
        })
        .error(function(res){
            console.log("res");
            console.log(res);
        });

效果很好!成功打印到控制台。

我无法理解这种奇怪的行为。只需添加success函数即可调用$http个活动?

这是我的完全控制者:

loginApp.controller('loginCtrl', ['$scope', '$state', 'loginSrvc', function($scope, $state, loginSrvc){

    $scope.loginForm = {};
    $scope.loginForm.email = "";
    $scope.loginForm.password = "";

    $scope.submit = function(){

        loginSrvc
        .success(function(res){
            console.log("res:");
            console.log(res);
        })
        .error(function(res){
            console.log("res");
            console.log(res);
        }); 
    }
}])

2 个答案:

答案 0 :(得分:3)

因为您的服务已经返回了已调用的$http服务,因此无需再次从控制器调用它。承诺已经可以使用。

更好的模式是使用ngResource,这样您就可以为每个API端点使用各自的promise来抽象处理程序。

答案 1 :(得分:1)

没有括号的传递是因为loginSrvc是一个对象而不是一个函数。

Factory API实例化Object

因为,您试图将Object作为函数调用,这就是您遇到错误的原因:

TypeError: object is not a function