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 は、ブロック方法として使用できない理由について完全に正しいです。マークのソリューションも問題を解決します。しかし、コードの再配置が不可能な場合でも、朗報があります。

$timeoutpromise を返すため ( を参照$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.");

そして、これは問題なく動作するはずです。それでもブロックしません。promise が解決された後にのみthen、呼び出し内の関数が実行されるようにするだけです。つまり、タイムアウトが完了し、メソッドが呼び出された場合にのみ実行されます。

さらに、必要に応じて、関数はデータを返すことができます。したがって、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 の前に実行されます。あなたが述べたように、tempFunc() の後に releasePrivilege() を実行したい場合は、tempFunc() に呼び出してもらいます。

于 2013-02-18T21:12:16.530 に答える