$ jout的Angular Js回调函数

kam*_*aci 3 javascript callback angularjs

我有那行代码

...
$timeout(tempFunc, $scope.sync.getDelay());
...
Run Code Online (Sandbox Code Playgroud)

在我的临时函数中,我在最后有这行代码:

$scope.sync.releasePrivilege();
Run Code Online (Sandbox Code Playgroud)

一切都运作良好.但是,当我尝试:

...
$timeout(tempFunc, $scope.sync.getDelay());
$scope.sync.releasePrivilege();
...
Run Code Online (Sandbox Code Playgroud)

它没有.我认为我应该将该行作为回调函数写入超时.我不想在我的代码中更改最近的函数我可以编辑那些行.

有任何想法吗?

PS:问题在于:

$ scope.sync.releasePrivilege();

超时后没有运行,它会立即运行.

Jos*_*ler 14

$timeoutsetTimeout测试期间被嘲笑的包装器.@MarkRajcok完全正确地说为什么使用它作为阻塞方法不起作用.Mark的解决方案也可以解决您的问题.但如果重新定位代码是不可行的,那么仍有好消息!

$timeout返回一个promise(请参阅参考资料$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.");
Run Code Online (Sandbox Code Playgroud)

如果你喜欢,这应该工作得很好.它仍然没有阻止.它只是确保只有在解析了promise之后才then执行调用中的函数,即仅在超时完成且调用了方法时才执行.

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

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

有很多的欣喜.好极了.


就像一个注释:在浏览器中进行睡眠会非常糟糕 - 它会锁定UI.异步执行是使Web成为一个很棒的平台的原因!