【发布时间】:2016-02-01 20:17:21
【问题描述】:
function getDBCounts() {
$http.get('URL')
.then(function (response){
$scope.stats = response.data;
$scope.getDBCountsTimeOut = setTimeout(getDBCounts, 5000);
}, function () {
$scope.getDBCountsTimeOut = setTimeout(getDBCounts, 5000);
})
}
$scope.$on("$destroy", function () {
clearTimeout($scope.getDBCountsTimeOut);
});
当我要去不同的控制器时,我会确保我正在取消所有超时,但问题是当 $http 调用处于挂起状态并且我同时移动到不同的控制器时(未创建超时直到我们得到响应)并且我无法取消控制器更改的超时,因为调用处于挂起状态并且我无法清除未创建的超时。
我该如何处理这种情况。这个问题的最佳解决方案是什么。
我已经这样做了,但是在错误部分我无法区分网络错误并取消了超时,因为如果是网络错误,我仍然需要调用 setTimeout。
$scope.canceler = $q.defer();
function getDBCounts() {
$http
.get(apiUri + '/backend/database/stats', {timeout: $scope.canceler.promise})
.then(function (response){
$scope.stats = response.data;
$scope.getDBCountsTimeOut = setTimeout(getDBCounts, 5000);
}, function (er, second) {
$scope.getDBCountsTimeOut = setTimeout(getDBCounts, 5000);
})
}
$scope.$on("$destroy", function () {
clearTimeout($scope.getDBCountsTimeOut);
$scope.canceler.resolve();
});
对于网络错误和超时,我得到这个作为响应:
{config: Object
data: null
headers: (name)
status: 0
statusText: ""}
现在我该如何解决这个问题。 提前致谢。
【问题讨论】:
-
您将在超时/中止时收到网络错误。
-
使用
$timeout与AngularJS框架$q服务有更好的集成,并且有cancel方法。 -
@如果您使用的是 Visual Studio 2013 或更高版本,那么这将对您有所帮助 - visualstudiogallery.msdn.microsoft.com/…
标签: javascript angularjs http settimeout angular-promise