Angularjs 是否有一种方法可以动态更改$interval的频率
我想出了这个类型脚本代码来检查连接。它每60秒进行一次检查以确认连接。我想这样做,以便在连接丢失时更频繁地进行连接检查。有什么办法可以让我这么做吗?我认为这将意味着改变时间间隔,但我不知道如何做到这一点,一旦$interval启动和运行Angularjs 是否有一种方法可以动态更改$interval的频率,angularjs,Angularjs,我想出了这个类型脚本代码来检查连接。它每60秒进行一次检查以确认连接。我想这样做,以便在连接丢失时更频繁地进行连接检查。有什么办法可以让我这么做吗?我认为这将意味着改变时间间隔,但我不知道如何做到这一点,一旦$interval启动和运行 isConnected = (): ng.IPromise<any> => { return this.$http({ method: 'GET', url: self.ac.dataServer + '
isConnected = (): ng.IPromise<any> => {
return this.$http({
method: 'GET',
url: self.ac.dataServer + '/api/Connect/Verify',
ignoreLoadingBar: true
} as ng.IRequestConfig);
};
openConnectionHandler = () => {
var self = this;
self.minutes = 0;
self.mos.closeConnectionModal()
}
closeConnectionHandler = () => {
var self = this;
if (self.minutes == 0) {
self.connectionModalBody = "Unable to establish a connection to the " + self.shortDomainName + " server";
} else if (self.minutes == 1) {
self.connectionModalBody = "Unable to establish a connection to the " + self.shortDomainName + " server for " + self.minutes + " minute.";
} else {
self.connectionModalBody = "Unable to establish a connection to the " + self.shortDomainName + " server for " + self.minutes + " minutes.";
}
self.minutes++;
self.mos.openConnectionModal();
}
checkConnection = () => {
var self = this;
self.isConnected().then(self.openConnectionHandler, self.closeConnectionHandler);
this.$interval(function () {
self.isConnected().then(self.openConnectionHandler, self.closeConnectionHandler);
}, 60 * 1000);
}
是的,有办法。您可以取消当前间隔,并使用不同的超时值创建一个新间隔 例如:
//here is where your interval initialization
var intervalPromise = $interval(intervalWhenConnectionIsUp, 60*1000);
function intervalWhenConnectionIsUp(){
//your stuff goes here
//let's say there is a variable which we can use to identify connection failures
if(connectionFailed){
//just cancel the current interval by the `cancel` method
intervalPromise.cancel();
//and set the proper interval function
intervalPromise = $interval(intervalWhenNoConnection, 30*1000)
}
}
function intervalWhenNoConnection(){
//your stuff goes here
if(connectionIsUp){
//just cancel the current interval by the `cancel` method
intervalPromise.cancel();
//and set the proper interval function
intervalPromise = $interval(intervalWhenConnectionIsUp, 60*1000)
}
}
您可以在另一个函数中设置interval,该函数将参数作为$interval的超时。并以所需的时间间隔调用此函数 这是没有全局变量的angularish代码
function MyCtrl($scope, $interval) {
var intervalInstance;
function onNoConnection() {
checkConnectionAtRate(30*1000);
}
function checkConnectionAtRate(rate) {
if (angular.isDefined(intervalInstance)) {
$interval.cancel(intercalInstance);
}
intervalInstance = $interval(function() {
//here goes the code;
console.log('Something');
}, rate);
}
function checkConnection() {
checkConnectionAtRate(60 * 1000);
}
}
更新2以适应问题陈述(不确定typescript语法)
我相信你知道你可以控制毫秒,因为任何人都可以清楚地看到,当连接仍然处于非活动状态时,是否希望在执行几次后加快呼叫速度?是的,我希望正常情况下每60秒检查一次,但一旦连接失败,我希望每10秒检查一次,直到连接再次工作。不喜欢此解决方案。您创建了一个全局变量(intervalInstance),还使用了
setInterval
而不是angular$interval。还有一个多余的检查,我不喜欢这个解决方案。你可以在控制器中创建那个实例,而不是一个全局变量。@Nils-我喜欢你的建议。为了帮助我自己和其他人,你能试着用我的代码来解释你的答案吗?这样可以帮助我理解我使用它的方式。Thanks@Nils-问题已更新,以显示isConnected()方法。@lamisti-谢谢。我对你的答案投了赞成票。您能否提供一个使用我的代码的解决方案,以便我和其他人能够看到它将如何适应。我不确定的是我应该如何调用您定义的函数。感谢you@Marilou我可以试试。问题:self.isConnected()
返回承诺。如果连接已启动,则将调用成功处理程序,否则faield回调right?@lamisti-Yes self.isConnected()将返回承诺。实际上,这只是对服务器的一个$http调用,以查看客户端是否可以连接到它。@lamisti-我更新了问题以显示已连接的服务器。此外,当连接中断时,我希望每10秒检查一次,而不是每60秒检查一次。
function MyCtrl($scope, $interval) {
var intervalInstance;
function onNoConnection() {
checkConnectionAtRate(30*1000);
}
function checkConnectionAtRate(rate) {
if (angular.isDefined(intervalInstance)) {
$interval.cancel(intercalInstance);
}
intervalInstance = $interval(function() {
//here goes the code;
console.log('Something');
}, rate);
}
function checkConnection() {
checkConnectionAtRate(60 * 1000);
}
}
openConnectionHandler = () => {
//same code
}
closeConnectionHandler = () => {
//same code
self.checkConnectionAt(30*1000);
}
checkConnection = () => {
var self = this;
self.checkConnectionAt(60 * 1000);
}
checkConnectionAt = (rate) => {
var self = this;
if(self.intervalInstance) {
$interval.cancel(self.intervalInstance);
}
self.intervalInstance = $interval(function () {
self.isConnected().then(self.openConnectionHandler, self.closeConnectionHandler);
}, rate);
}