2014-02-21 123 views
0

我的應用程序有一個$ rootScope變量,當有Ajax 請求正在進行時,它被設置爲一個非零值。我設置了一個轉輪來顯示這個變量的值是否比零更多。僞代碼:如何讓一個變量的值等於另一個值,但延遲設置?

$rootScope.pendingRequests > 0 then show the spinning wheel 

結果是,對於非常快速的請求,輪子快速閃爍。我想通過僅在請求已經進行超過500毫秒的情況下使輪子出現來避免這種閃光。我的想法是有一個名爲$ rootScope.pendingRequestsDebounced另一個變量,有這種遵循$值這樣rootScope.pendingRequests:

  • 如果$ rootScope.pendingRequests先後爲超過0值在* 至少500毫秒 * S然後設置:$ rootScope.pendingRequestsDebounced = $ rootScope.pendingRequests

  • 如果$ rootScope.pendingRequests等於0,則立即着手:$ rootScope.pendingRequestsDebounced = $ rootScope.pendingRequests(無延遲)。

+0

您的ajax呼叫是同步呼叫還是異步呼叫? –

回答

1

您可以使用$超時服務在500毫秒後踢來檢查待處理的請求:

if ($rootScope.pendingRequests == 0) 
{ 
    $rootScope.pendingRequestsDebounced = $rootScope.pendingRequests; 
} 
else 
{ 
    var currentTimeoutHandler = $timeout(function() 
    { 
     $rootScope.pendingRequestsDebounced = $rootScope.pendingRequests; 
     //You can keep checking 500 ms later by creating new timeout call right in here 
    },500); 
} 

編輯:函數pas sed到$ timeout只執行一次,在這種情況下500ms之後。如果你只想執行一次該函數(看起來你是這樣),那麼上面的代碼就足夠了。但是,如果你要調用一個函數每500ms你需要寫:

var currentTimeoutHandler = $timeout(checkFn, 500); 
function checkFn() 
{ 
    $rootScope.pendingRequestsDebounced = $rootScope.pendingRequests; 
    currentTimeoutHandler = $timeout(checkFn, 500); //Re-execute this function after 500ms 
}; 
+0

你能解釋一下你對評論的意思,並說明我可以再次檢查嗎? –

+0

請檢查編輯 – Aidin

0

我想你可以做這樣的事情

var timeoutTask = null; 

$scope.showLoader = false; 
$rootScope.$watch('pendingRequests', function(val, oldVal) { 
    $timeout.cancel(timeoutTask); 
    if (val) { 
     timeoutTask = $timeout(function() { 
      $scope.showLoader = true; 
     },500); 
    } 
}); 

標記

<div id="loader" ng-show="showLoader"></div> 
0

創建一個定時器,將其設置爲500毫秒,每當它進入(或低於)零,重新回至500毫秒,並檢查自旋值。

使用$ watch監視該值。一旦變爲零,從上面殺死定時器並繼續。

相關問題