2014-09-27 64 views
0

我遇到了ajax調用的問題。 我有一些代碼設置運行的功能,每2秒,這看起來看到,如果內容已經與WordPress AJAX更新與否,確實有一些用PHP的工作,然後更新數據庫:ajax在數據庫解鎖後多次觸發

window.setInterval("updateContent()", 2000); 

function updateContent(){  

    if($('#needcontent').hasClass('yes')){ 
     CONTENT.updateContent('monitor' , ids); 
    } 

} 

$(function() { 

    CONTENT= { 

     updateContent: function(callback, data){ 

      data = {    
       action: 'myplugin_do_ajax', 
       callback: callback, 
       data: data        
      }; 

      $.post(ajaxurl, data, function(response){ 

       switch(data.callback){ 

        case 'monitor' : 

         data_returned = eval("(" + response + ")"); 

         if(data_returned.completed == 'true'){ 
          //Adjust the DOM because there was a content update, and remove the class "yes" from #needcontent to stop the check until next time 
         } 
         else{ 
          //Do nothing because no content was found, let the Interval run again 
         } 

        break; 

       } 


      } 

    } 

} 

問題我發現有時這些內容非常大,並且在php更新數據庫時鎖定表格。 ajax調用運行一次,運行到數據庫鎖中,並且不會返回任何內容,直到數據庫再次解鎖。數據庫可能會被鎖定10秒,導致1次運行和4次未運行的呼叫。

UPDATE: 這不是數據庫鎖定,它是PHP函數返回時間超過2秒,導致Interval一次又一次地循環而沒有響應。

發生了什麼事情是那些4個未運行的ajax調用然後開始一個接一個地發射一個像他們試圖趕上或什麼的。

我試過將間隔時間增加到10秒,但這並沒有解決問題,因爲如果數據庫被鎖定了11秒,它仍然會發生兩次。

我已經嘗試在JavaScript(yuck)中使用全局變量來停止調用該函數的時間間隔,但這似乎並不奏效。

UPDATE 2: 我在下面回答了我自己的問題,以幫助我解決問題。

+0

不使用'setInterval',使用'AJAX的成功,而不是 – charlietfl 2014-09-27 16:21:16

+0

@charlietfl內setTimeout' - 謝謝。您將我的想法轉向解決方案,爲我解決這個問題 – David 2014-09-28 02:50:56

回答

0

試試這個:

window.updateCheck= window.setInterval("updateContent()", 2000); 

function updateContent(){  

    if($('#needcontent').hasClass('yes')){ 
     CONTENT.updateContent('monitor' , ids); 
     clearInterval(window.updateCheck); 
    } 

} 

$(function() { 

    CONTENT= { 

     updateContent: function(callback, data){ 

      data = {    
       action: 'myplugin_do_ajax', 
       callback: callback, 
       data: data        
      }; 
      if(window.ajaxCall) window.ajaxCall.abort(); 

      window.ajaxCall= $.post(ajaxurl, data, function(response){ 
       window.updateCheck= window.setInterval("updateContent()", 2000); 
       switch(data.callback){ 

        case 'monitor' : 

         data_returned = eval("(" + response + ")"); 

         if(data_returned.completed == 'true'){ 
          //Adjust the DOM because there was a content update, and remove the class "yes" from #needcontent to stop the check until next time 
         } 
         else{ 
          //Do nothing because no content was found, let the Interval run again 
         } 

        break; 

       } 


      } 

    } 

} 

我們在這裏做是把在一個全局變量的時間間隔,並在Ajax調用($。員額()調用實際上),更新那麼當條件被檢查,我們停止時間間隔,終止所有其他活動或排隊的請求並將ajax請求發送到服務器。

當請求被髮送到服務器時,更新檢查被停止,然後一旦服務器響應請求,我們再次開始更新檢查!在我的OP

+0

'嘗試這個'很難解釋您的解決方案在OP代碼或方法中的變化。人們不應該需要使用diff工具來知道差異在哪裏 – charlietfl 2014-09-27 16:24:11

+0

@charlietfl我正在寫解釋!對於延遲 – 2014-09-27 16:25:35

+0

對不起,雖然這是一個很好的答案,並適用於其他情況,但我想盡量避免在全局空間中使用setInterval。主要是因爲它會涉及一個重要的代碼重寫。看到我的答案是如何解決這個問題的。 – David 2014-09-28 02:50:24

0

charlietfl的評論讓我思考的setInterval和setTimeout的之間的區別,我意識到:

一)的setInterval會連續運行,不管退回或不結果。在我的情況下,使用ajax,該函數正在異步調用,所以setInterval不會在乎是否返回結果。

b)如果我更改了代碼以使用setTimeout,我可以更多地控制結果。

這就是我所做的。

首先,完全刪除setInterval函數,這是不需要的。

然後,我改變了我的開關情況如下:

case 'monitor' : 

    var monitor = false; 

    data_returned = eval("(" + response + ")"); 

    if(data_returned.completed == 'true'){ 
     //Adjust the DOM because there was a content update, and remove the class "yes" from #needcontent to stop the check until next time 
    } 
    else{ 
     //Run the monitor after a 2 second timeout. 
     var ids = j('.contentDiv').attr('id'); 
     window.setTimeout(CONTENT.updateContent('monitor' , ids) , 2000); 
    } 

break;