当我在工厂内链接 Promise 或将其接管到 Controller 时,我遇到了这个棘手的场景。
几个相同的问题:
- 哪一个是有益的?在工厂函数或 Controller 中编写then和catch。
- 业务场景
- 性能优势
之前我曾经在工厂方法中像这样编写 then 和 catch 链接:
function searchReservations(lastName, arrivalDate)
{
// alert(lastName + ' ' + arrivalDate)
return $http({
method: 'GET',
url: baseUrl + '/reservation?lastName='+lastName+'&arrivalDate='+arrivalDate
})
**.then(success)
.catch(failure);**
function success(response) {
return response;
}
function failure(error) {
console.log('XHR Failed for searchReservation' + error.data);
return error;
}
}
但作为一种新趋势,我看到 then 和 catch 都被写入 Controller 函数中。有点像这样。
HRS.searchReservations(this.searchLastName, arrivalDate).then(function(response) {
...
}).catch(function(response){
...
})
更具体地说,关于业务案例和性能优势,我想知道这里的区别。
谢谢, 安基特
最佳答案
我用的是第一个。我发现它更干净、更容易阅读,并且允许您命名您的方法以使其更加清晰。
在服务中,我的成功和错误函数将响应数据转换为我的 Controller 将使用的 View 模型格式。
然后在我的 Controller 中,我还有一个成功和错误函数来处理以有意义的方式显示该输出。但 Controller 只对数据的显示感兴趣,其中服务处理任何转换、本地存储等。
此外,如果您的服务中有失败方法,并且希望它触发 Controller 的 catch 函数,则需要返回 $q.reject(error)
。
旁注,您可以使用 params: ...
轻松、干净地将查询参数附加到您的网址:
{
method: 'GET',
url: baseUrl + '/reservation',
params: {
lastName: lastName,
arrivalDate: arrivalDate
}
}
我喜欢如何构建服务方法:
function searchReservations (lastName, arrivalDate) {
var config = {
method: 'GET',
url: baseUrl + '/reservation',
params: {
lastName: lastName,
arrivalDate: arrivalDate
}
};
return $http(config).then(success).catch(error);
////////////
function success (response) {
return response;
}
function error (response) {
console.log('XHR Failed for searchReservation' + response.data);
return $q.reject(response);
}
}
注意,在这种情况下,您甚至不需要 success
方法,因为它不执行任何操作,因此您可以完全跳过它,如下所示:return $http(config) .catch(错误)
。 Controller 上的任何 .then(...)
仍会被触发。
关于javascript - Factory - AngularJS 中的 then 和 Catch Promise 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34399666/