JavaScript 的setTimeout 和Angular中的$timeout的區別


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的變化。

后面我會接着學習

  1. Scope提供$watch方法監視Model的變化。
  2. Scope提供$apply方法傳播Model的變化。

這兩者之間的區別。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM