2013-02-18 84 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