Angularjs 是否有一种方法可以动态更改$interval的频率

Angularjs 是否有一种方法可以动态更改$interval的频率,angularjs,Angularjs,我想出了这个类型脚本代码来检查连接。它每60秒进行一次检查以确认连接。我想这样做,以便在连接丢失时更频繁地进行连接检查。有什么办法可以让我这么做吗?我认为这将意味着改变时间间隔,但我不知道如何做到这一点,一旦$interval启动和运行 isConnected = (): ng.IPromise<any> => { return this.$http({ method: 'GET', url: self.ac.dataServer + '

我想出了这个类型脚本代码来检查连接。它每60秒进行一次检查以确认连接。我想这样做,以便在连接丢失时更频繁地进行连接检查。有什么办法可以让我这么做吗?我认为这将意味着改变时间间隔,但我不知道如何做到这一点,一旦$interval启动和运行

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);
  }