$timeout, $interval


layout: post
title: Angular@1.4.3 中文 API 服務篇 $timeout & $interval
desc: '$timeout 是一個window.setTimeout 的Angular封裝,這個 fn 函數(shù)被封裝成了一個 try/catch 塊并且授 $exceptionHandler 服務以任何例外。$interval是Angular對 window.setInterval 的封裝。fn 函數(shù)將在每次延時的時候執(zhí)行。一個注冊的間隔函數(shù)的返回值是一個 promise
'
categories: jekyll update


$timeout


  • ng模塊中的服務

window.setTimeout 的Angular封裝,這個 fn 函數(shù)被封裝成了一個 try/catch 塊并且授 $exceptionHandler 服務以任何例外。

調(diào)用 $timeout 的返回值是一個 promise, 這個 promise 將會在延時已經(jīng)結(jié)束時被解析,
超時函數(shù)(如果有的話)被執(zhí)行了。

退出一個超時請求,調(diào)用 $timeout.cancel(promise)。如果在測試中你可以使用 $timeout.flush()
來同步刷新 deferred函數(shù)的隊列。而如果你僅僅想要得到一個在一個指定延時時間之后會被解析的 promise,
你可以僅僅調(diào)用 $timeout 而不傳入 fn 函數(shù)。


用法

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

參數(shù)
參數(shù) 形式 詳細
fn(可選) function()= 已經(jīng)將在延時之后被執(zhí)行的函數(shù)。
delay(可選) number 以毫秒計的延時時間。(默認值: 0)
invokeApply(可選) boolean 如果設置為 false則跳過模型的臟值檢測,否則將在 fn 內(nèi)調(diào)用 $apply 塊。(默認值: true)
Pass(可選) * 函數(shù)執(zhí)行的附加參數(shù)
返回

Promise - promise 將會在超時達成后被解析,它的值會被 fn 的返回值解析。


方法

cancel([promise]); - 取消一個與 promise 相關聯(lián)的任務。這個結(jié)果會導致,promise會被拒絕解析。

參數(shù)
參數(shù) 形式 詳細
promise (可選) promise $timeout 函數(shù)返回的 promise
返回

boolean - 如果任務沒有被執(zhí)行就被成功取消了,則會返回 true。


$interval

  • ng模塊中的服務

Angular對 window.setInterval 的封裝。fn 函數(shù)將在每次延時的時候執(zhí)行。一個注冊的間隔函數(shù)的返回值是一個 promise
這個 promise 將會在interval每次調(diào)用的時候得到廣播,并且在計數(shù)迭代之后被解析,或者在未指定次數(shù)的情況下既執(zhí)行無數(shù)次時解析。
這個通知的值將是已運行迭代的次數(shù)。如果想終端一個 interval,則調(diào)用 $interval.cancel(promise)

測試中你可以使用 $interval.flush(millis) 設置其中的 millis 為毫秒時間來到達指定的時間點,
并且會觸發(fā)在此過程中任何的函數(shù)。

注意: 用此服務創(chuàng)建的interval必須要在完成之后被明文銷毀。特別地,在控制器的作用域和指令的元素被銷毀時,
interval 也不會被自動銷毀。你需要將此納入考慮之中,確保在適合的時間退出 interval。詳述之后的例子將會
介紹何時與怎樣去做這些處理。


用法

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

參數(shù)
參數(shù) 形式 詳細
fn function() 一個將被反復調(diào)用的函數(shù)
delay number 毫秒記的間隔時間
count (可選) number 循環(huán)的次數(shù).如果不傳入或者為0,那么$interval將會無限循環(huán). (默認值: 0)
invokeApply (可選) boolean 如果設置為 true 則跳過臟值檢測,否則將在 fn 中執(zhí)行 $apply (默認值: true)
Pass (可選) * 函數(shù)執(zhí)行的附加參數(shù)
返回

promise - 一個每次迭代都會被通知的 promise。


方法

cancel([promise]); - 取消一個與 promise 相關的任務。

參數(shù)
參數(shù) 形式 詳細
promise (可選) promise 通過$interval 函數(shù)返回。
返回

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已經(jīng)被銷毀
      $scope.stopFight();
    });
  }])
// 用工廠方法注冊一個 'myCurrentTime' 指令。
// 我們注入 $interval 服務和源自 DI 的 dateFilter 服務。
.directive('myCurrentTime', ['$interval', 'dateFilter',
  function($interval, dateFilter) {

    // 返回指令鏈接的函數(shù). (不需要編譯函數(shù))
    return function(scope, element, attrs) {
      var format,  // 數(shù)據(jù)格式
          stopTime; // 以便我們可以取消時間更新

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

      // 監(jiān)視表達式,并在改變時更新UI。
      scope.$watch(attrs.myCurrentTime, function(value) {
        format = value;
        updateTime();
      });

      stopTime = $interval(updateTime, 1000);

      // 監(jiān)聽 DOM 銷毀(去除)事件,并取消下一次的UI更新
      // 是為了在 DOM 被刪除之后防止再次更新次數(shù)。
      element.on('$destroy', function() {
        $interval.cancel(stopTime);
      });
    }
  }]);
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 我的理解:$interval 就是一個循環(huán)函數(shù),每個多長時間執(zhí)行一次; **intreval.cancel(pro...
    萱草的時間閱讀 3,464評論 0 1
  • Angular 創(chuàng)建模塊: var oneApp = angular.module("myApp",[ ] ) ...
    AkaTBS閱讀 2,116評論 0 17
  • 弄懂js異步 講異步之前,我們必須掌握一個基礎知識-event-loop。 我們知道JavaScript的一大特點...
    DCbryant閱讀 2,886評論 0 5
  • 你不知道JS:異步 第三章:Promises 在第二章,我們指出了采用回調(diào)來表達異步和管理并發(fā)時的兩種主要不足:缺...
    purple_force閱讀 2,250評論 0 4
  • 原文地址:http://es6.ruanyifeng.com/#docs/promise Promise 的含義 ...
    AI云棧閱讀 978評論 0 7

友情鏈接更多精彩內(nèi)容