在返回promise的函数上使用.success时,Undefined不是函数

时间:2014-10-23 03:59:25

标签: javascript angularjs promise

我试图通过编写登录功能继续理解承诺。 Login函数是AuthService的一部分,它向我的服务器发送一个http请求并返回一个promise(如果用户被验证则解析,如果没有,则解析,否则拒绝)。

当我在我的控制器中调用该函数时,我尝试使用.success和.error,因为该函数返回一个promise但是我得到错误" Undefined不是函数"。

这是我的函数,它获取了未定义的错误。

$scope.login = function(email, password) {
  return AuthService.login(email, password).success(function(data) {
    return console.log("login function returned", data);
  }).error((function(data) {
    return console.log("There was an error " + data);
  }));
};

这是我的服务

.service('AuthService', function($window, $rootScope, $q, $http) {
  return {
    login: function(email, password) {
      var deferred;
      deferred = $q.defer();
      $http.post('/dashboard/login', {
        email: email,
        password: password
      }).error(function(error, status) {
        console.log("Incorrect logi");
        return deferred.reject(error);
      }).success(function(data, status) {
        $window.sessionStorage["userInfo"] = JSON.stringify(data);
        return deferred.resolve(data);
      });
      return deferred.promise;
    }
  };
});

让我最困惑的是,在研究之后,似乎承诺没有成功或错误的方法,但$ http是一种承诺,有这种方法。如果他们没有成功和错误,你怎么知道某件事是否是错误?最后,如果没有成功或错误方法,那么.reject和.resolve是什么意思?

1 个答案:

答案 0 :(得分:4)

  

让我最困惑的是,在研究之后,似乎承诺没有成功或错误的方法,但$ http是一个有这种方法的承诺

是的,的确如此。 $http返回对象是因遗留原因而拥有这些.success.error方法的承诺。

  

如果他们没有成功和错误你怎么知道某件事是否是错误?

将处理程序附加到promise的标准方法是使用.then() method,它也充当链接方法并返回处理程序结果的新承诺。

所以代码看起来像这样(也是avoiding the deferred antipattern):

.service('AuthService', function($window, $rootScope, $q, $http) {
  return {
    login: function(email, password) {
      return $http.post('/dashboard/login', {
        email: email,
        password: password
      }).then(function(data, status) {
        $window.sessionStorage["userInfo"] = JSON.stringify(data);
        return data;
      }, function(error, status) {
        console.log("Incorrect login");
        throw error;
      });
    }
  };
});

$scope.login = function(email, password) {
  return AuthService.login(email, password).then(function(data) {
    return console.log("login function returned", data);
  }, function(err) {
    return console.log("There was an error " + err);
  });
};