0

実行中のスクリプトを一時停止しようとしています。setTimeout に固執せずにこれを達成するにはどうすればよいですか? 問題は、これはコードのスニペットに過ぎず、残りは非常に大きく、setTimeout に貼り付けることで混乱を招く可能性があることです。

$.ajax({
    type: 'POST',
    url: rAction,
    data: rData,
    success: function(msg){

    // BEFORE PROCEEDING TO THE FOLLOWING CODE, WAIT 5 SECONDS
    wait(5000); //?

    $('h1').hide();

    $('#result').html(msg);
    $('#alertTxt').html($('#result .system-error-message').html());
    $('#alert').slideDown('fast');
    $('#regForm').slideUp('fast');
    $("html, body").animate({ scrollTop: 170 }, 600);
    $('#but_submit').show();
    $('#processing').hide();

});
4

3 に答える 3

0

遅延させたいコードを別の関数に入れ、その関数を setTimeout に渡します。これにより、「実際の」コードがきれいに整頓された状態に保たれます。

function handleResponse() {
  $('h1').hide();

  $('#result').html(msg);
  $('#alertTxt').html($('#result .system-error-message').html());
  $('#alert').slideDown('fast');
  $('#regForm').slideUp('fast');
  $("html, body").animate({ scrollTop: 170 }, 600);
  $('#but_submit').show();
  $('#processing').hide();
}

$.ajax({
  type: 'POST',
  url: rAction,
  data: rData,
  success: function(msg){

  // BEFORE PROCEEDING TO THE FOLLOWING CODE, WAIT 5 SECONDS
  setTimeout(function() {
    handleResponse(msg);
  }, 5000); 
});
于 2013-07-12T19:32:07.940 に答える
0

... setTimeout に固執せずにこれを達成するにはどうすればよいですか?

長時間実行される複雑なコードをブラウザーに返したくない場合は、Web ワーカーを使用できます。このコードは DOM を直接変更することはできませんが、メッセージをメイン スクリプトにポストして、メイン スクリプトに何を変更するかを伝えることができます。

Web ワーカーをサポートしていないブラウザーでは、基本的に (setTimeoutおよびそのいとこ) を返すしかありません。

ウェブ上でさまざまなウェブワーカーの例を見つけることができますが、価値があるのは、ここで別の回答のために行ったものです。これは、多数にカウントする進行状況を示しています。しかし、概念は同じです。長期実行スクリプトは、メインの JavaScript スレッドとは別に実行され、更新を 経由で投稿しますpostMessage

主なドキュメントとスクリプト:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Progress</title>
<style type="text/css">
body, html {
  height: 100%;
}
body {
    font-family: sans-serif;
}
</style>
</head>
<body>
<div id="progress"><em>(Click to start)</em></div>
<script>
(function() {
  var div = document.getElementById("progress");
  var counter = new Worker("counter.js");

  div.addEventListener("click", run);

  counter.addEventListener("message", function(event) {
    div.innerHTML = "Counter so far: " + event.data.counter;
  });

  function run() {
    div.removeEventListener("click", run);
    counter.postMessage({ max: 10000000 });
  }
})();
</script>
</body>
</html>

counter.jsweb-worker スクリプト (これらは常に別のファイルです):

self.addEventListener("message", function(event) {
  var max;
  var counter;

  max = event.data && event.data.max || 100000;
  for (counter = 0; counter < max; ++counter) {
    if (counter % 1000 === 0) {
      self.postMessage({counter: counter});
    }
  }
  self.postMessage({counter: counter});
});
于 2013-07-12T19:20:39.333 に答える
-1

それを関数に入れて setTimeout(func, 5000) でその関数を呼び出さないのはなぜですか?

于 2013-07-12T19:21:27.260 に答える