2017-04-18 28 views
0

私は、毎秒実行されるsetInterval関数を持っています。さて、ブラウザで私のコンソールを調べてみたところ、setInterval関数内の関数が時々2回実行されていました。どうすれば2回の実行を防ぐことができますか?ここでは、今、check_getqueue関数の内部で、私はまた、私は二度実行しているから、それを防ぐためにしたいという機能を持っているsetInterval関数が2回実行されるのを防ぐ

$('#myclinic_id').change(function(){ 
    clearInterval(interval); 
    lastQueueID = 0; 
    $("#boxqueue").empty(); 
    var selectedClinicID = $(this).val(); 
    clinicID = selectedClinicID; 
    statusClinic(clinicID, userID); 
    show_patients(clinicID, userID); 

    if(selectedClinicID != "0" || selectedClinicID != undefined){ 
    interval = setInterval(function(){ 
    check_getqueue(clinicID, userID); 
    }, 4000); 
    } 
});$('#myclinic_id').change(function(){ 
    clearInterval(interval); 
    lastQueueID = 0; 
    $("#boxqueue").empty(); 
    var selectedClinicID = $(this).val(); 
    clinicID = selectedClinicID; 
    statusClinic(clinicID, userID); 
    show_patients(clinicID, userID); 

    if(selectedClinicID != "0" || selectedClinicID != undefined){ 
    interval = setInterval(function(){ 
    check_getqueue(clinicID, userID); 
    }, 4000); 
    } 
}); 

私の問題が発生している:

は、ここに私のsetIntervalです。ここで私のコードはcheck_getqueue関数の中にあります。ここでは、check_getqueue関数内でrefresh_afterdel(clinicID, userID);という関数が実行されないようにしています。ここで

は私check_getqueueの完全なコードです:

function check_getqueue(clinicID, userID) { 
var tmpCountQ = []; 
    $.ajax({ 
    url: siteurl+"sec_myclinic/checkingUpdates/"+clinicID+"/"+userID, 
    type: "POST", 
    dataType: "JSON", 
    success: function(data) { 
     for(var i=0;i<data.length;i++) { 
     tmpCountQ.push(data[i]['queue_id']); 
     }; 
     if(typeof lastCon[0] != "undefined") 
     { 
     for(j=0;j < tmpCountQ.length;j++) 
     { 
      if(tmpCountQ[j] != lastCon[j]) 
      { 
      refresh_afterdel(clinicID, userID); 
      lastCon[j] = tmpCountQ[j]; 
      } 
     } 
     } 
     else 
     { 
     lastCon = tmpCountQ; 
     } 
     // console.log("lastCon "+lastCon) 
     // console.log("tmpCountQ "+tmpCountQ); 
    } 
    }); 
} 
+0

を重複したコードを削除しますか? – evolutionxbox

+0

代わりに 'setTimeout()'を使用してください – mike510a

答えて

2

それはあなたがそれをスケジュールする方法によって異なります。あなたのcheck_getqueue機能はそれだけで機能することを開始非同期プロセスだし、次に返し、文字通り自分自身と重なってではありません。プロセスは後で完了するまでに完了せず、check_getqueueへの次の呼び出しが次の非同期プロセスを開始する前に、まだ(明らかに)完了していないことがあります。

あなたの基本的な2つの選択肢がある:

  1. は、ガード変数を使用して変数が設定されている間check_getqueueへの呼び出しを無視:

    var check_getqueue_ignore = false; 
    function check_getqueue() { 
        if (check_getqueue_ignore) { 
         return; 
        } 
        check_getqueue_ignore = true; 
        $.ajax({ 
         // ... 
         complete: function() { 
          check_getqueue_ignore = false; 
         } 
        }); 
    } 
    
  2. 全くsetIntervalを使用しないでください。

    timer = setTimeout(check_getqueue, 4000); 
    // ... 
    
    function check_getqueue() { 
        $.ajax({ 
         // ... 
         complete: function() { 
          timer = setTimeout(check_getqueue, 4000); 
         } 
        }); 
    } 
    

    あなたはできるだけ離れて4000msに近い開始を維持しようとする場合check_getqueueが開始されたとき、あなたは覚えている可能性があり:その代わり、check_getqueueは前回の非同期結果が戻ってきた後にのみ、その次の呼び出しをスケジュールしていますその結果が戻ってくるまでにかかった時間を剃り落とす:

    timer = setTimeout(check_getqueue, 4000); 
    // ... 
    
    function check_getqueue() { 
        var started = Date.now(); 
        $.ajax({ 
         // ... 
         complete: function() { 
          timer = setTimeout(check_getqueue, Math.max(0, 4000 - (Date.now() - started))); 
         } 
        }); 
    } 
    
+0

Doh! #1で 'return'が表示されない場合は、リフレッシュしてください。 '4000:'の代わりに '4000:')が表示された場合は、リフレッシュしてください。 (うわー、私の目は今日私にトラブルを与えている。) –

+0

あなたの答えのおかげでこんにちは。私はあなたの答えを今チェックしています。 –

+0

こんにちは、私は常に多くのユーザーを作成したので、私はいつも変数の状態をチェックしています、それは他のユーザーによって使用されていた、 refresh_afterdel(clinicID、userID)が2回実行されていることがあります。 –

関連する問題