【问题标题】:Why am I able to execute an $http function just by adding .success to it?为什么我可以通过添加 .success 来执行 $http 函数?
【发布时间】:2015-02-07 19:56:51
【问题描述】:

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

【问题讨论】:

    标签: javascript angularjs angular-promise angular-http


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

    Factory API 实例化一个Object

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

    TypeError: object is not a function

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2021-09-19
      • 2013-07-29
      • 2011-11-19
      相关资源
      最近更新 更多