$timeout, $interval


layout: post
title: Angular@1.4.3 中文 API 服务篇 $timeout & $interval
desc: '$timeout 是一个window.setTimeout 的Angular封装,这个 fn 函数被封装成了一个 try/catch 块并且授 $exceptionHandler 服务以任何例外。$interval是Angular对 window.setInterval 的封装。fn 函数将在每次延时的时候执行。一个注册的间隔函数的返回值是一个 promise
'
categories: jekyll update


$timeout


  • ng模块中的服务

window.setTimeout 的Angular封装,这个 fn 函数被封装成了一个 try/catch 块并且授 $exceptionHandler 服务以任何例外。

调用 $timeout 的返回值是一个 promise, 这个 promise 将会在延时已经结束时被解析,
超时函数(如果有的话)被执行了。

退出一个超时请求,调用 $timeout.cancel(promise)。如果在测试中你可以使用 $timeout.flush()
来同步刷新 deferred函数的队列。而如果你仅仅想要得到一个在一个指定延时时间之后会被解析的 promise
你可以仅仅调用 $timeout 而不传入 fn 函数。


用法

$timeout([fn], [delay], [invokeApply], [Pass]);

参数
参数 形式 详细
fn(可选) function()= 已经将在延时之后被执行的函数。
delay(可选) number 以毫秒计的延时时间。(默认值: 0)
invokeApply(可选) boolean 如果设置为 false则跳过模型的脏值检测,否则将在 fn 内调用 $apply 块。(默认值: true)
Pass(可选) * 函数执行的附加参数
返回

Promise - promise 将会在超时达成后被解析,它的值会被 fn 的返回值解析。


方法

cancel([promise]); - 取消一个与 promise 相关联的任务。这个结果会导致,promise会被拒绝解析。

参数
参数 形式 详细
promise (可选) promise $timeout 函数返回的 promise
返回

boolean - 如果任务没有被执行就被成功取消了,则会返回 true


$interval

  • ng模块中的服务

Angular对 window.setInterval 的封装。fn 函数将在每次延时的时候执行。一个注册的间隔函数的返回值是一个 promise
这个 promise 将会在interval每次调用的时候得到广播,并且在计数迭代之后被解析,或者在未指定次数的情况下既执行无数次时解析。
这个通知的值将是已运行迭代的次数。如果想终端一个 interval,则调用 $interval.cancel(promise)

测试中你可以使用 $interval.flush(millis) 设置其中的 millis 为毫秒时间来到达指定的时间点,
并且会触发在此过程中任何的函数。

注意: 用此服务创建的interval必须要在完成之后被明文销毁。特别地,在控制器的作用域和指令的元素被销毁时,
interval 也不会被自动销毁。你需要将此纳入考虑之中,确保在适合的时间退出 interval。详述之后的例子将会
介绍何时与怎样去做这些处理。


用法

$interval(fn, delay, [count], [invokeApply], [Pass]);

参数
参数 形式 详细
fn function() 一个将被反复调用的函数
delay number 毫秒记的间隔时间
count (可选) number 循环的次数.如果不传入或者为0,那么$interval将会无限循环. (默认值: 0)
invokeApply (可选) boolean 如果设置为 true 则跳过脏值检测,否则将在 fn 中执行 $apply (默认值: true)
Pass (可选) * 函数执行的附加参数
返回

promise - 一个每次迭代都会被通知的 promise


方法

cancel([promise]); - 取消一个与 promise 相关的任务。

参数
参数 形式 详细
promise (可选) promise 通过$interval 函数返回。
返回

boolean - 如果任务被成功取消则返回 true


例子

html

<div>
  <div ng-controller="ExampleController">

    <label>Date format: <input ng-model="format"></label> <hr/>
    Current time is: <span my-current-time="format"></span>
    <hr/>

    Blood 1 : <font color='red'>{{blood_1}}</font>
    Blood 2 : <font color='red'>{{blood_2}}</font>

    <button type="button" data-ng-click="fight()">Fight</button>
    <button type="button" data-ng-click="stopFight()">StopFight</button>
    <button type="button" data-ng-click="resetFight()">resetFight</button>
  </div>
</div>

javascsript

angular.module('intervalExample', [])
.controller('ExampleController', ['$scope', '$interval',
  function($scope, $interval) {

    $scope.format = 'M/d/yy h:mm:ss a';
    $scope.blood_1 = 100;
    $scope.blood_2 = 120;

    var stop;
    $scope.fight = function() {
      // 如果$scope.fight进行中,则不会开启新的 $scope.fight
      if ( angular.isDefined(stop) ) return;

      stop = $interval(function() {
        if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {
          $scope.blood_1 = $scope.blood_1 - 3;
          $scope.blood_2 = $scope.blood_2 - 4;
        } else {
          $scope.stopFight();
        }
      }, 100);
    };
    $scope.stopFight = function() {
      if (angular.isDefined(stop)) {
        $interval.cancel(stop);
        stop = undefined;
      }
    };

    $scope.resetFight = function() {
      $scope.blood_1 = 100;
      $scope.blood_2 = 120;
    };

    $scope.$on('$destroy', function() {
      // 保证interval已经被销毁
      $scope.stopFight();
    });
  }])
// 用工厂方法注册一个 'myCurrentTime' 指令。
// 我们注入 $interval 服务和源自 DI 的 dateFilter 服务。
.directive('myCurrentTime', ['$interval', 'dateFilter',
  function($interval, dateFilter) {

    // 返回指令链接的函数. (不需要编译函数)
    return function(scope, element, attrs) {
      var format,  // 数据格式
          stopTime; // 以便我们可以取消时间更新

      // 用于更新 UI
      function updateTime() {
        element.text(dateFilter(new Date(), format));
      }

      // 监视表达式,并在改变时更新UI。
      scope.$watch(attrs.myCurrentTime, function(value) {
        format = value;
        updateTime();
      });

      stopTime = $interval(updateTime, 1000);

      // 监听 DOM 销毁(去除)事件,并取消下一次的UI更新
      // 是为了在 DOM 被删除之后防止再次更新次数。
      element.on('$destroy', function() {
        $interval.cancel(stopTime);
      });
    }
  }]);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容