2013-02-18 95 views
2

我有一個行代碼

... 
$timeout(tempFunc, $scope.sync.getDelay()); 
... 

在我的氣溫功能我有一個行代碼在結束:

$scope.sync.releasePrivilege(); 

,一切運作良好。但是,當我嘗試:

... 
$timeout(tempFunc, $scope.sync.getDelay()); 
$scope.sync.releasePrivilege(); 
... 

它沒有。我認爲我應該將該行作爲回調函數寫入超時。我不想在我的代碼中更改最近的功能,我只能編輯這些行。

任何想法?

PS:的問題是:

$ scope.sync.releasePrivilege();

超時後未運行,立即運行。

+0

什麼確切的「不起作用」?你可以發佈不工作的代碼到plnkr.co或jsfiddle看看有什麼問題 – 2013-02-18 20:14:39

+0

@ValentynShybanov我編輯了我的問題。 – kamaci 2013-02-18 20:22:53

+1

你可以發佈顯示超時後未被調用的plunker示例嗎? – 2013-02-18 20:51:04

回答

13

$timeoutsetTimeout的封裝,在測試過程中被嘲笑掉。 @MarkRajcok完全正確地說明爲什麼將它用作阻止方法不起作用。馬克的解決方案也可以解決你的問題。但是如果重新定位你的代碼是不可行的,那還有好消息!

$timeout返回一個承諾(見$q),這樣可以真正鏈在一起你想要什麼:

$timeout(tempFunc, $scope.sync.getDelay()).then(function() { 
    console.log("I'm called only after the timeout."); 
    $scope.sync.releasePrivilege(); 
}); 

console.log("But I get called immediately."); 

這應該工作得很好,你應該看中。它仍然沒有阻止。它只是確保then調用中的功能僅在承諾解決後才執行,即只有在超時完成且您的方法已被調用時。

此外,如果需要,您的函數可以返回數據。所以,如果tempFunc返回表示成功的一個布爾值,你也可以訪問它:

$timeout(tempFunc, $scope.sync.getDelay()).then(function(result) { 
    if (result) { 
    $scope.sync.releasePrivilege(); 
    } else { 
    // handle the error 
    } 
}); 

而且還有大家歡欣鼓舞。好極了。


就像一個說明:在瀏覽器中進行睡眠會非常糟糕 - 它會鎖定用戶界面。異步執行是使Web成爲一個真棒平臺的原因!

1

超時不提供相當於「睡眠」。 $ timeout將在本地事件隊列中工作(在你的情況下,tempFunc),因此tempFunc將在稍後調用(在瀏覽器呈現之後)。因此將在tempFunc之前執行$scope.sync.releasePrivilege();。正如你所說,如果你想在tempFunc()之後執行releasePrivilege(),請讓tempFunc()調用它。

+0

我想你對我的要求有了解。有沒有其他方法可以實現它? – kamaci 2013-02-18 21:40:52

+0

我不這麼認爲:http://stackoverflow.com/questions/951021/what-do-i-do-if-i-want-a-javascript-version-of-sleep – 2013-02-18 21:44:32

+0

我應該使用setTimeout還是$超時是否也一樣? – kamaci 2013-02-18 21:47:54