为什么我可以通过添加 .success 来执行 $http 函数

Why am I able to execute an $http function just by adding .success to it?

本文关键字:执行 http 函数 success 可以通过 添加 为什么      更新时间:2023-09-26

我创建了一个返回$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);
        }); 
    }
}])

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

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

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

工厂 API 实例化Object

由于您尝试将 Object 作为函数调用,这就是您出现错误的原因:

TypeError: object is not a function