JavaScript中setTimeout返回值類型和意義說明:
1、setTimeout :暫停指定的毫秒數后執行指定的代碼,返回值是id標識,這個id的意義就是通過clearTimeout來清理暫停執行函數。
setTimeout函數的ID標識(number類型),每次調用setTimeout函數都會產生一個唯一的ID,可以通過clearTimeout函數(此函數的參數接收一個setTimeout返回的ID)暫停setTimeout函數還未執行的代碼
<html> <head> <script type="text/javascript"> var c=0 var t function timedCount()//開始計時 { document.getElementById('txt').value=c c=c+1 t=setTimeout("timedCount()",1000) } function stopCount(){//停止計時 clearTimeout(t) } </script> </head> <body> <form> <input type="button" value="開始計時!" onClick="timedCount()"> <input type="button" value="停止計時!" onClick="stopCount()"> <input type="text" id="txt"> </form> <p>請點擊上面的按鈕。輸入框會從 0 開始一直進行計時。</p> </body> </html>
AngularJS中$timeout返回值類型和意義說明:
和javascript中原生的setTimeout()以及setInterval()函數不同,AngularJS中的$timeOut()函數會返回一個promise。和其他的promise一樣,你可以綁定$timeOut的resolved和rejected時間。然而更重要的是,你可以通過將這個promise傳遞給$timeOut.cancel()方法來取消掉潛在的定時器。
timeout函數的返回值是一個promise,當到達設置的超時時間時,這個承諾將被解決,並執行timeout函數。
需要取消timeout,需要調用$timeout.cancel(promise);
使用: $timeout(fn,[delay],[invokeApply]);
fn:一個將被延遲執行的函數。
delay:延遲的時間(毫秒)。
invokeApply:如果設置為false,則跳過臟值檢測,否則將調用$apply。
$scope.timer = $timeout( function(){ $scope.backup("1"); }, 10000);
方法:
cancel(promise);
取消與承諾相關聯的任務。這個的結果是,承諾將被以摒棄方式來解決。
promise:$timeout函數返回的承諾。
$timeout.cancel($scope.timer)
其實兩者之間還有一個很重要的區別,首先我們下面來看例子:
例子1:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
<script>
var app = angular.module("timeApp",[]);
app.controller("timeController",function($scope,$timeout){
$scope.message ="Waiting 2000ms for update";
setTimeout(function () {
$scope.message ="Timeout!";
}, 2000);
});
</script>
</head>
<body>
<div ng-app="timeApp" ng-controller="timeController">
<label>{{message}}</label>
</div>
</body>
</html>
顯示的結果:
2000ms后,頁面並沒有更新為:Timeout!,數據的更新沒有被angular JS覺察到。
例子2:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
<script>
var app = angular.module("timeApp",[]);
app.controller("timeController",function($scope,$timeout){
$scope.message ="Waiting 2000ms for update";
setTimeout(function () {
$scope.$apply(function () { $scope.message ="Timeout!"; });
}, 2000);
});
</script>
</head>
<body>
<div ng-app="timeApp" ng-controller="timeController">
<label>{{message}}</label>
</div>
</body>
</html>
結果顯示:


用$scope.$apply()包起來。頁面上先會顯示:Waiting 2000ms for update,等待2秒后內容會被更改為:Timeout! 。顯然數據的更新被angular JS覺察到了。
例子3:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
<script>
var app = angular.module("timeApp",[]);
app.controller("timeController",function($scope,$timeout){
$scope.message ="Waiting 2000ms for update";
$timeout(function () { $scope.message ="Timeout!"; }, 2000);
});
</script>
</head>
<body>
<div ng-app="timeApp" ng-controller="timeController">
<label>{{message}}</label>
</div>
</body>
</html>
結果顯示:


使用angularjs自帶的$timeout()函數,頁面上先會顯示:Waiting 2000ms for update,等待2秒后內容會被更改為:Timeout! 。顯然數據的更新被angular JS覺察到了。
所以從上面三個例子來看,我們可以很直觀的看出:JavaScript 的setTimeout 和Angular中的$timeout的區別。Angular中的$timeout比JavaScript 的setTimeout多了一個$apply方法用於傳播Model的變化。
后面我會接着學習
- Scope提供$watch方法監視Model的變化。
- Scope提供$apply方法傳播Model的變化。
這兩者之間的區別。
