Angular 定时器$timeout和$interval,延时调用

项目中有用到定时器定时刷新页面的数据,在网上查看了一些资料,整理了一下,备忘。

$timeout

用法如下$timeout(fn,[delay],[invokeApply]);

  • fn:一个将被延迟执行的函数。
  • delay:延迟的时间(毫秒)。
  • invokeApply:如果设置为false,则跳过脏值检测,否则将调用$apply。

方法cancel(promise); 
promise:$timeout函数的返回值。

具体使用:在项目中用到的其中一处是键入字符然后自动发送请求查询,如果每键入一个字符即发送一次请求,在数据库表庞大的时候,数据库肯定会有意见了。这时候就需要用到延时查询了,还需要结合$watch,具体使用如下:

var timeout;
$scope.$watch(‘idNo‘, function(newVal, oldVal) {
  if(newVal != oldVal) {
    if(timeout) {
      $timeout.cancel(timeout);
    }
    timeout = $timeout(function() {
      $http.get(url).success(function(data) {});
    }, 800);
  }
});

如上写法,if(newVal != oldVal){}是默认情况下不查询,键入字符后才会发送请求查询,若想默认情况下就查询则需要去掉该if判断。$timeout.cancel(timeout);是清除上次$itmeout返回的promise。

$interval

用法如下$interval(fn,delay,[count],[invokeApply],[Pass]);

  • fn:一个将被反复执行的函数。
  • delay:每次调用的间隔毫秒数值。
  • count:循环次数的数值,如果没设置,则无限制循环。
  • invokeApply:如果设置为false,则避开脏值检查,否则将调用$apply。
  • Pass:函数的附加参数。

方法cancel(promise); 
promise:$interval函数的返回值。 
具体使用

1.经常使用的是

function hello() {
...
    console.log("hello world");
}
var timer = $interval(function(){
  function hello() {}
},100);
timer.then(function() {
  console.log("done");
});

以上是每100毫秒执行hello()函数,每执行完一次则调用then函数。 
2. 控制循环的次数:var timer = $interval(function(){},100,10);,参数10则是限制定时器循环10次,若该参数没有定义则表示无数次循环。 
3. 清除interval定时器:通过‘interval.cancle(timer)`删除$interval返回的promise即可清除,而且必须要清除,否则会无限循环。在angular controller中只要开始执行定时任务,只要不清除则会一直执行,无论是否切换到其他的controller和页面,可能会导致不必要的错误。 
4. 项目中用到的完整实例:

// 定时器 定时刷新数据
var timer = $interval(
  function() {
    hello();//自己定义的每次需要执行的函数,也可以写一些其他的内容
  },
  5000
);
//当DOM元素从页面中被移除时,AngularJS将会在scope中触发$destory事件。
//这让我们可以有机会来cancel任何潜在的定时器。切换controller、页面后即可调用
$scope.$on(
  "$destroy",
  function() {
    $interval.cancel( timer );
  }
);

本文转载自:http://blog.csdn.net/xuanhaiyang2008/article/details/52121540

时间: 2024-11-08 21:56:56

Angular 定时器$timeout和$interval,延时调用的相关文章

Angular 定时器$timeout和$interval关于定时刷新页面和发送请求的用法

项目中有用到定时器定时刷新页面的数据,在网上查看了一些资料,整理了一下,备忘. $timeout 用法如下:$timeout(fn,[delay],[invokeApply]); fn:一个将被延迟执行的函数. delay:延迟的时间(毫秒). invokeApply:如果设置为false,则跳过脏值检测,否则将调用$apply. 方法:cancel(promise); promise:$timeout函数的返回值. 具体使用:在项目中用到的其中一处是键入字符然后自动发送请求查询,如果每键入一个

GCD 和延时调用

GCD 和延时调用 由 王巍 (@ONEVCAT) 发布于 2015/05/13 因为 Playground 不进行特别配置的话是无法在线程中进行调度的,因此本节中的示例代码需要在 Xcode 项目环境中运行.在 Playground 中可能无法得到正确的结果. GCD 是一种非常方便的使用多线程的方式.通过使用 GCD,我们可以在确保尽量简单的语法的前提下进行灵活的多线程编程.在 “复杂必死” 的多线程编程中,保持简单就是避免错误的金科玉律.好消息是在 Swift 中是可以无缝使用 GCD 的

【转】performSelector延时调用导致的内存泄露

performSelector延时调用导致的内存泄露 转载:http://blog.csdn.net/wangqiuyun/article/details/7587929 前几天在给游戏做收尾测试时,发现了一个关于内存泄露的问题,一直没找着问题所在,经过反复调试和查找资料今天终于解决了,特此记录下来以免以后再犯! 关于objective-c的内存管理,我们都知道一个原则就是"谁创建,谁释放",换句话说,不是我们创建的,就不用我们去释放.但是实际上objective-c的内存管理远远没那

一个延时调用问题

如果用下面第1行的写法,调用 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(removeFromSuperview) object:nil]; 可以生效 如果用下面第3行的写法,调用 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(removeFromSuperview) object:nil];

performSelector延时调用导致的内存泄露

关于objective-c的内存管理,我们都知道一个原则就是“谁创建,谁释放”,换句话说,不是我们创建的,就不用我们去释放.但是实际上objective-c的内存管理远远没那么简单,我的情况是这样的: 我在debug模式下面用CCLOG在dealloc函数里面输出一些信息,目的就是要检查场景的dealloc方法在replaceScene的 时候有没有被调用,按照子龙山人大哥的说法,如果场景切换的时候dealloc没有调用,说明你这个场景的内存有问题.有可能被某个对象retain了, 其retai

定时器 延时调用setTimeout

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

AngularJS中$timeout和$interval的用法详解

1. 先将$interval,$timeout,作为参数注入到controller中,例如rds.controller('controllerCtrl', ['app', '$scope','$http','$routeParams','$filter','$location','$interval','$timeout', function (app, $scope,$http,$routeParams,$filter,$location,$interval,$timeout) {2.在需要用

延时调用

方法1:performSelector [self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)] --SEL 调用哪个方法 --id 参数 --NSTimeInterval 延时时间 方法2:NSTimer NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval) target:(id) selector:(SEL) userInfo:(id) repea

angular : $eval &amp; $timeout

$digest: function() { var watch, value, last, watchers, length, dirty, ttl = TTL, next, current, target = this, watchLog = [], logIdx, logMsg, asyncTask; beginPhase('$digest'); // Check for changes to browser url that happened in sync before the call