Javascript $http PROMITE始终返回原始承诺?

Javascript $http PROMITE始终返回原始承诺?,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,如果这不是一个好问题,我很抱歉,但这让我有点困惑 我试图从工厂内的$http.post()返回特定数据,但是$http似乎总是返回原始承诺。我希望避免.成功和.错误,因为它们在v1.5中可能会贬值。考虑到工厂可能会执行其他操作,例如在localStorage中设置项等,我不想直接返回$http.post() 无论如何,以下是从$http承诺返回特定数据的最佳方法吗 function login (email, password) { var deferred = $q.defer();

如果这不是一个好问题,我很抱歉,但这让我有点困惑

我试图从工厂内的
$http.post()
返回特定数据,但是$http似乎总是返回原始承诺。我希望避免.成功和.错误,因为它们在v1.5中可能会贬值。考虑到工厂可能会执行其他操作,例如在localStorage中设置项等,我不想直接返回$http.post()

无论如何,以下是从$http承诺返回特定数据的最佳方法吗

function login (email, password) {
  var deferred = $q.defer();

  $http.post('/api/auth', {
    email: email,
    password: password
  })
    .then(function (data) {
      return deferred.resolve('success');
    })
    .catch(function (data) {
      return deferred.reject('fail');
    });

  return deferred.promise;
}

您不需要创建
延迟的
对象。相反,您可以从
$http.post
返回结果$http.post返回一个承诺,该承诺碰巧有两个额外的方法(success和failure)


您可能有兴趣阅读这篇文章,它解释了如何通过承诺链传播数据和拒绝原因。

我会用错误响应作为“then”方法的第二次回调来编写它(我下面的示例)。这样,只有在$http请求出现错误时才会调用错误回调

function login (email, password) { 
   var deferred = $q.defer();
   $http.post('/api/auth', {
     email: email,
     password: password
   })
   .then(function (data) {
     return deferred.resolve(data);
   }, function (message) {
     return deferred.reject(message);
   });
   return deferred.promise;
}
您这样做的方式—使用catch()—意味着如果承诺链中出现任何错误,它将被调用。因此,catch()最有可能用于几个承诺的结尾。比如像这样的

CustomerService.login(email, password)
   .then(getUserData)
   .then(setUpAccount)
   .catch($log.error);


另外,请查看“承诺API”部分的文档。

我理解这一点,但我想在服务中处理一些事情,将http逻辑从控制器中抽象出来。对不起,我应该说得更清楚些。不。这仍然是问题所在。伯吉,我同意你的观点,谢谢你指出这一点。我现在明白多了。抛开这些,你就不能抓住具体的错误吗?IE catch(SpecificError,函数(e){})。IE特定于链的捕获处理程序,专注于您可能想要处理的内容,然后有一个全面的捕获。好的,我可能会混合蓝鸟和q之间的相似之处。看起来q不像我指定的那样在catch链中有一个谓词。抓字错误
CustomerService.login(email, password)
   .then(getUserData)
   .then(setUpAccount)
   .catch($log.error);