Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript $timeout的角Js回调函数_Javascript_Callback_Angularjs - Fatal编程技术网

Javascript $timeout的角Js回调函数

Javascript $timeout的角Js回调函数,javascript,callback,angularjs,Javascript,Callback,Angularjs,我有那一行代码 ... $timeout(tempFunc, $scope.sync.getDelay()); ... 在我的temp函数中,我在末尾有一行代码: $scope.sync.releasePrivilege(); 一切都很顺利。然而,当我尝试: ... $timeout(tempFunc, $scope.sync.getDelay()); $scope.sync.releasePrivilege(); ... 没有。我认为我应该将该行作为回调函数写入timeout。我不想在我

我有那一行代码

...
$timeout(tempFunc, $scope.sync.getDelay());
...
在我的temp函数中,我在末尾有一行代码:

$scope.sync.releasePrivilege();
一切都很顺利。然而,当我尝试:

...
$timeout(tempFunc, $scope.sync.getDelay());
$scope.sync.releasePrivilege();
...
没有。我认为我应该将该行作为回调函数写入timeout。我不想在我的代码中更改最近的函数,我可以编辑这些行

有什么想法吗

PS:问题在于:

$scope.sync.releasePrivilege()


超时后不运行,它会立即运行。

超时不提供“睡眠”的等价物$超时将工作(在您的示例中是tempFunc)放在本机事件队列上,因此稍后(在浏览器呈现之后)将调用tempFunc<代码>$scope.sync.releasePrivilege()将在tempFunc之前执行。如您所述,如果希望在tempFunc()之后执行releasePrivilege(),请让tempFunc()调用它。

$timeout
setTimeout
的包装,在测试过程中会被模拟出来@MarkRajcok完全正确地解释了为什么使用它作为阻塞方法不起作用。马克的解决方案也能解决你的问题。但是,如果重新定位代码是不可行的,那么仍然有好消息

$timeout
返回一个承诺(请参阅),因此您实际上可以将所需内容链接在一起:

$timeout(tempFunc,$scope.sync.getDelay())。然后(function()){
log(“只有在超时后才会调用我”);
$scope.sync.releasePrivilege();
});
log(“但是我马上就接到了电话。”);
如果你喜欢的话,这个应该很好用。它仍然无法阻止。它只是确保
then
调用中的函数只有在承诺得到解决后才执行,也就是说只有在超时完成并且调用了您的方法时才执行

此外,如果需要,您的函数可以返回数据。因此,如果
tempFunc
返回一个表示成功的布尔值,您也可以访问它:

$timeout(tempFunc,$scope.sync.getDelay())。然后(函数(结果){
如果(结果){
$scope.sync.releasePrivilege();
}否则{
//处理错误
}
});
大家都很高兴。耶



需要注意的是:在浏览器中睡眠是非常糟糕的——它会锁定用户界面。异步执行使web成为一个了不起的平台

什么确切的“不起作用”?你能把不起作用的代码发布到plnkr.co或jsfiddle上看看是什么吗wrong@ValentynShybanov我已经编辑了我的问题。你能发布一个plunker示例,显示超时后没有调用它吗?我想你已经了解我的问题了。有没有其他方法可以实现它?我不这么认为:我应该使用setTimeout还是$timeout做同样的事情?@kamaci
$timeout
setTimeout
的包装,在测试过程中会被模仿,所以一定要使用它。在浏览器中睡眠会非常糟糕——它会锁定用户界面。异步执行使web成为一个了不起的平台。但是
$timeout
返回一个承诺,所以只需将它链接起来:
$timeout(…)。然后(function(){$scope.sync.releasePrivilege())
@JoshDavidMiller你应该写下这个作为答案,它是有效的。