我有那行代码
...
$timeout(tempFunc, $scope.sync.getDelay());
...
在我的临时函数中,我在最后有这行代码:
$scope.sync.releasePrivilege();
一切顺利。但是,当我尝试:
...
$timeout(tempFunc, $scope.sync.getDelay());
$scope.sync.releasePrivilege();
...
没有。我认为我应该将该行作为回调函数写入超时。我不想在我的代码中更改最近的函数我可以编辑那些行。
有什么想法吗?
PS:问题是:
$ scope.sync.releasePrivilege();
在超时后没有运行,它会立即运行。
答案 0 :(得分:14)
$timeout
是setTimeout
的包装器,在测试过程中被模拟掉了。 @MarkRajcok完全正确地说为什么使用它作为阻塞方法不起作用。 Mark的解决方案也可以解决您的问题。但是,如果重新定位代码是不可行的,那么仍有好消息!
$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
}
});
并且非常欢欣鼓舞。耶。
正如笔记:在浏览器中进行睡眠会非常糟糕 - 它会锁定UI。异步执行是使Web成为一个很棒的平台的原因!
答案 1 :(得分:1)
超时不能提供相当于“睡眠”的功能。 $ timeout将工作(在您的情况下,tempFunc)放在本机事件队列上,因此稍后将调用tempFunc(在浏览器呈现之后)。因此$scope.sync.releasePrivilege();
将在tempFunc之前执行。如上所述,如果你想在releaseFunc()之后执行releasePrivilege(),请让tempFunc()调用它。