javascript - 在 Angular 1.4 中,在控制器中,我可以在 $http 请求之前和成功/错误之后插入“事件”以执行吗?
问题描述
我有一个需要发出大量数据请求的 Angular UI 应用程序。通常,我需要一个响应式 UI,即使我调用的 API 在返回结果方面不是那么快。这意味着我需要经常将应用程序置于“正在加载... ”状态。
我可以通过设置一个加载标志来实现这一点,当状态改变时 Angular UI 会关闭该标志,但这看起来是这样的:
$scope.requestFooData = function() {
var parameters = $scope.BuildFooParams();
//'loadingData' is a state variable that the UI uses
//for disabling regions, or showing spinners where
//and when applicable.
$scope.loadingData = true;
$http.get("API/getFoo" + parameters)
.success(function(data) {
//Handle data
$scope.loadingData = false;
})
.error(function() {
//Address the error
$scope.loadingData = false;
});
}
这行得通,但我必须记住在每个请求中集成至少三行代码。不仅如此,我可能需要在后续成功的 API 调用中隐藏一些 API 调用,级联 API 请求。在这种情况下,最好连接一个可以确定何时正确设置加载状态的信号量。在这种方法下,该逻辑变得更加复杂和令人费解。
有没有一种方法可以在我的控制器初始化时注入一个在发出任何 Web 请求(GET/POST/等)时触发的方法,一旦结果返回,它会触发另一个事件以进行状态清理?
解决方案
微调器标志的重置可以放在一个.finally
块中:
$scope.loadingData = true;
$http.get("API/getFoo" + parameters)
.then(function(response) {
var data = response.data;
//Handle data
̶$̶s̶c̶o̶p̶e̶.̶l̶o̶a̶d̶i̶n̶g̶D̶a̶t̶a̶ ̶=̶ ̶f̶a̶l̶s̶e̶;̶
}).catch(function(response) {
//Address the error
̶$̶s̶c̶o̶p̶e̶.̶l̶o̶a̶d̶i̶n̶g̶D̶a̶t̶a̶ ̶=̶ ̶f̶a̶l̶s̶e̶;̶
}).finally(function() {
$scope.loadingData = false;
});
该.finally
块允许您观察承诺的实现或拒绝,但无需修改最终值。这对于释放资源或做一些无论承诺被拒绝还是解决都需要做的清理很有用。
有关详细信息,请参阅
推荐阅读
- unity3d - Unity 检测 ui 画布上的封闭白色表面
- cpu-architecture - 为什么 FADDP D-form 在 Cortex-A72 上的吞吐量高于 FADDP Q-form
- java - 当我尝试运行@Query 时,为什么 JPA /Hibernate 会抛出“java.lang.NegativeArraySizeException: -1”?
- html - 以角度分页显示表格的更多行
- microservices - Question about architecture of microservices over http for Nestjs
- laravel - 与环境关联的一个或多个 TargetGroup 处于降低的健康状态
- oracle-apex - Oracle APEX 自定义成功消息
- node.js - Firestore 错误:没有要更新的文档(在重试方法中)
- arrays - 为什么我在 C 中的数组函数长度给出了错误的答案?
- vue.js - 通过 vuex 在 v-select 中显示数据(通过 axios)