$ jout的Angular Js回调函数

时间:2013-02-18 19:46:30

标签: javascript callback angularjs

我有那行代码

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

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

$scope.sync.releasePrivilege();

一切顺利。但是,当我尝试:

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

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

有什么想法吗?

PS:问题是:

  

$ scope.sync.releasePrivilege();

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

2 个答案:

答案 0 :(得分:14)

$timeoutsetTimeout的包装器,在测试过程中被模拟掉了。 @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()调用它。