0

ミリ秒の値をループしようとしています。彼がループから取得した値に応じて、xxx​​x 秒ごとにいくつかのコードを実行する必要がありますが、それを機能させることはできません。

コードにはリセットボタンが含まれています(コードはプラグインからのものですが、変更する必要がありました)

//プラグインオプション

  step:[
      {
          time: 6000,
          // more stuff here 
          // but we dont need 
          // it in this example
      },
      {
          time: 3000,
          // more stuff here 
          // but we dont need 
          // it in this example
      },
      {
          time: 12000,
          // more stuff here 
          // but we dont need 
          // it in this example
      }
  ]

// ループ

  var timeouts = [];
  $.each(options.step, function(i, value){

      var time =  value.time;                                                       
      timeouts.push(setTimeout(function(){

          alert('some action');

      },time*i));

  });

// リセットボタン

  $('.stop').click(function(){
      $.each(timeouts, function (_, id) {
          clearTimeout(id);
      });
      timeouts = [];
  })
4

3 に答える 3

0

設定する間隔は、0秒(6000 * 0)、3秒(3000 * 1)、および24秒(24000 * 2)になります。これは、インデックス()を掛けているためですi。これはあなたが達成しようとしている時間間隔ですか?

于 2012-09-13T01:57:59.067 に答える
0

time*i-これはおそらくあなたの問題です。

たとえば、提供されたデータを例にとると、次の時間が得られます:6000、、。300012000

これらに、を掛けると、、、iが得られます。0300024000

編集:以下のコメントで示唆されているように、最初の値を常にゼロにし、結果の値をそのままにしておく必要があります。

タイムアウトの遅延をに設定すると機能しi == 0 ? 0 : timeます。

これは基本的に意味しますexpression ? true : false;

次に例を示します:http://jsfiddle.net/2ka9g/1/

于 2012-09-13T01:58:45.377 に答える
0

ここでの私の主な推測は、目的のタイマー時間を設定していないということです。i * value.time奇妙に思えるタイマー時間を使用しています。それが配列のインデックスであることを認識していますか?i最初はゼロ、次に 1、次に 2 などになります...

これにより、タイマー時間が:0*6000, 1*3000, 2*12000に変換され0, 3000, 24000ます。

それはあなたが望むものではないようです。

さらに、ブラウザーの Javascript はシングル スレッドです (webWorkers と、ここで説明していないいくつかのイベント サイド エフェクトを除く)。そのため、setTimeout()正確性を保証するものではありません。タイマー イベントの発生時に別の何かが実行されている場合、そのタイマー イベントはイベント キューに入り、後で Javascript 実行の現在のスレッドが終了したときに実行されます。したがってsetTimeout()、発火時に他の何かが実行されていると、時間どおりに実行されません。

于 2012-09-13T01:55:23.287 に答える