我是一名新开发人员,我正在尝试检查5秒后是否仍未解决承诺。在没有创建新指令/服务/工厂的情况下,最可读的方法是什么?这是我尝试过的,我的主要问题是,我是否在实例化promise变量时在正确的时间设置间隔?
$scope.promiseTimeLimit = false;
//if the promise does not return within 5 seconds, show a "service down" warning.
var promise = service.checkValidRailCar($scope.railcar.number, $scope.railcar.initials);
$interval(function () {
$scope.promiseTimeLimit = true
}, 5000)
if ($scope.promiseTimeLimit) {
$scope.message = {
content: [{
title: '',
msg: 'The Service Is Down'
}],
type: 'error'
};
return;
}
promise.then(function (data) {
if (!data.valid) {
$scope.invalidData = true;
$scope.message = {
content: [{
title: '',
msg: 'Invalid: This is not a valid data and can not be created.'
}],
type: 'error'
};
} else {
$scope.invalidData = false;
}
})
答案 0 :(得分:1)
是的,您在实例化promise后正确设置了时间间隔。但是,我认为你不想在这里使用$interval
。您可能想要使用$timeout
。除非您清除$interval
,否则将一次又一次地调用$interval
中的回调函数。 $timeout
中的回调函数只会被调用一次。如果您只想检查一次是否在5秒内解决了承诺,则应使用$timeout
。
第二件事是关于以下代码:
if ($scope.promiseTimeLimit) {
$scope.message = {
content: [{
title: '',
msg: 'The Service Is Down'
}],
type: 'error'
};
return;
}
您需要将此代码保留在$ timeout函数内。为了更好地理解,我将变量名称$scope.promiseTimeLimit
更改为$scope.promiseComplete
并将其初始化为$scope.promiseComplete = false
。
$timeout(function () {
if(!$scope.promiseComplete) {
$scope.message = {
content: [{
title: '',
msg: 'The Service Is Down'
}],
type: 'error'
};
}
}, 5000);
然后,在promise.then
函数(解析)中,您需要将$scope.promiseComplete
设置为true。
promise.then(function (data) {
$scope.promiseComplete = true;
if (!data.valid) {
...
})
那么,这里发生了什么? $ timeout回调函数将在5秒后或之后调用。它将检查$scope.promiseComplete
是否为假。如果为false,则生成警告消息。如果是真的,什么也不做。在promise.then
中,我们将$scope.promiseComplete
设置为true。因此,如果promise.then
函数(resolve)在调用$ timeout回调函数之前将$scope.promiseComplete
设置为true,则表示promise在5秒之前完成。
我已经创建了一个样本plunker来理解这种行为。您可以查看HERE。
答案 1 :(得分:0)
事实上,异步超时实际上是种族中window.setTimeout()
与您要调用的任何异步服务方法的默认值。
你可以这样写,例如:
service.checkValidRailCarWithTimeout = function(t, railcarNumber, railcarInitials) {
// range checks
if(t === undefined || railcarNumber === undefined || railcarInitials === undefined) {
return $q.reject(new RangeError('Invalid parameter(s)'));
}
// race - timeout versus service call
return $q(function(resolve, reject) {
var tRef = window.setTimeout(function() {
reject(new Error('The Service Is Down');
}, t);
function kill() {
window.clearTimeout(tRef);
};
service.checkValidRailCar(railcarNumber, railcarInitials).then(resolve, reject).then(kill, kill);
});
};
请致电如下:
var promise = service.checkValidRailCarWithTimeout(5000, $scope.railcar.number, $scope.railcar.initials).then(function(data) {
$scope.invalidData = !data.valid;
if (!data.valid) {
throw new Error('Invalid: This is not a valid data and can not be created.');
}
}).catch(function(error) {
$scope.message = {
content: [{
title: '',
msg: error.message
}],
type: 'error'
};
});
注意:
$scope.promiseTimeLimit
的需求消失kill()
并非绝对必要,但通过清除失去种族的潜在时间来保持清洁。$scope.message = ...
表达式将显示error