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);