3

我有那行代码

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

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

$scope.sync.releasePrivilege();

一切正常。但是,当我尝试:

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

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

有任何想法吗?

PS:问题是:

$scope.sync.releasePrivilege();

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

4

2 回答 2

14

$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调用中的函数仅在 promise 解决后才执行,即仅在超时完成并且您的方法已被调用时才执行。

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

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

有很多的欣喜。耶。


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

于 2013-02-19T06:56:27.950 回答
1

超时不提供等效的“睡眠”。$timeout 将工作(在您的情况下为 tempFunc)放在本机事件队列上,因此 tempFunc 将在稍后(在浏览器呈现之后)被调用。 $scope.sync.releasePrivilege();因此将在 tempFunc 之前执行。正如您所说,如果您希望 releasePrivilege() 在 tempFunc() 之后执行,请让 tempFunc() 调用它。

于 2013-02-18T21:12:16.530 回答