5、Angular中的$timeOut定時器
人們似乎常常將AngularJS中的$timeOut()函式看做是一個內建的、無須在意的函式。但是,如果你忘記了$timeOut()的回撥函式將會造成非常不好的影響,你可能會因此遇到程式碼莫名其妙的出現問題,或者無端丟擲一個錯誤甚至是一遍一遍的重複對的你的伺服器進行$http請求這些詭異的情形。管理好你的$timeOut定時器的小技巧就是在$destory事件中將它們取消。
和javascript中原生的setTimeout()以及setInterval()函式不同,AngularJS中的$timeOut()函式會返回一個promise。和其他的promise一樣,你可以繫結$timeOut的resolved和rejected時間。然而更重要的是,你可以通過將這個promise傳遞給$timeOut.cancel()方法來取消掉潛在的定時器。
在一個AngularJS應用中,這一點非常的重要,因為定時器可以結束執行那些不再與應用狀態和使用者介面相關的程式碼。最佳情形中,這些過程都會悄悄的發生;在不好的情況下,它會引起不可預測的行為並導致很差的使用者體驗。為了讓應用順暢的執行,你應該總是把握好你的$timeOut定時器;你需要在相應的控制器和指令接收到$destory事件時呼叫$timeOut.cancel()方法。
為了更加清楚的說明這點,下面的這個例子將會有一些DOM元素通過ngSwitch/ngSwitchWhen指令來建立或銷燬。注意到當$destory事件被觸發時(在這裡的例子中是位於指令中),我們將取消當前的定時器:
/*
* $timeout定時器測試
*/
// 定義控制器
test.controller(
"DemoController",
function( $scope ) {
$scope.section = "htesty";
//在toggle函式中改變section的值,以此在標記中顯示/隱藏不同的部分
$scope.toggle = function() {
if ( $scope.section === "htesty" ) {
$scope.section = "sad";
} else {
$scope.section = "htesty";
}
};
}
);
//定義指令
test.directive("bnDirective", function($timeout) {
//將使用者介面的事件繫結到$scope上
function link($scope, element, attributes) {
//當timeout被定義時,它返回一個promise物件
var timer = $timeout(function() {
console.log("Timeout executed", Date.now());
}, 3000);
//將resolve/reject處理函式繫結到timer promise上以確保我們的cancel方法能正常執行
timer.then(function() {
console.log("Timer resolved!", Date.now());
}, function() {
console.log("Timer rejected!", Date.now());
});
//★當DOM元素從頁面中被移除時,AngularJS將會在scope中觸發$destory事件。這讓我們可以有機會來cancel任何潛在的定時器
$scope.$on("$destroy", function(event) {
$timeout.cancel(timer);
console.log("timer has been removed!");
});
}
//返回指令的配置
return ({
link : link,
scope : false
});
});
頁面中:
<div ng-controller="DemoController">
<h4>Don't Forget To Cancel $timeout Timers In Your $destroy Events In AngularJS</h4>
<p>
<a href="#" ng-click="toggle()">Toggle Section</a>
</p>
<div ng-switch="section">
<p ng-switch-when="happy" bn-directive>Oh sweet!</p>
<p ng-switch-when="sad" bn-directive >Oh noes!</p>
</div>
</div>
結果:
"Timeout executed" 1427091576150
"Timer resolved!" 1427091576151
"timer has been removed!"
本文譯自Don’t Forget To Cancel $timeout Timers In Your $destroy Events In AngularJS,
原文地址為http://www.bennadel.com/blog/2548-Don-t-Forget-To-Cancel-timeout-Timers-In-Your-destroy-Events-In-AngularJS.htm
相關文章
- thrift中的超時(timeout)坑
- VC中定時器的使用定時器
- Golang當中的定時器Golang定時器
- java 中定時器Java定時器
- Qt中的定時器的使用QT定時器
- iOS中的3種定時器iOS定時器
- spring中定時器的使用Spring定時器
- C#中的定時器(二)C#定時器
- Android中的定時器AlarmManagerAndroid定時器
- 定時器以及定時器的幾個案例定時器
- SAP UI5和angular裡的常量定義UIAngular
- angular中的自定義過濾器Angular過濾器
- 給 Angular 伺服器端渲染應用設定一個渲染超時時間Angular伺服器
- 51模組_定時器與中斷定時器
- 深入理解HTML5定時器requestAnimationFrameHTML定時器requestAnimationFrame
- 設定Shell command的timeout
- ionic5+angular 中 modal的ngIf報錯Angular
- Go 的定時器Go定時器
- Job 類中 $timeout 設定無效 ? - 已關閉
- 定時器定時器
- 設定mysql 事務鎖超時時間 innodb_lock_wait_timeoutMySqlAI
- Java可自定義中斷定時器的實現Java定時器
- java定時器的使用Java定時器
- Angular HTTP 請求自定義 timeout 值的一種實現思路AngularHTTP
- 原來定時器中斷是個偽中斷定時器
- [iOS]各種定時器–最全的定時器使用iOS定時器
- 使用 RxJS timeout 操作符給 Angular SSR 渲染模式下的 HTTP 請求新增超時機制JSAngular模式HTTP
- Nginx的超時timeout配置詳解Nginx
- .NET中如何實現高精度定時器定時器
- java中SpringBoot定時器註解JavaSpring Boot定時器
- Springboot 連線池wait_timeout超時設定Spring BootAI
- MongoDB中的定時索引MongoDB索引
- iOS定時器iOS定時器
- JavaScript定時器JavaScript定時器
- js定時器JS定時器
- JavaScript 定時器JavaScript定時器
- 核心定時器定時器
- JS忍者祕籍中的定時器機制詳解JS定時器