2012-08-10 249 views
3

我正在運行一個函數來檢查數據庫條目是否存在。clearInterval在一種情況下失敗,但在另一種情況下失敗

在我的網頁加載我檢查元素是否存在,如果是這樣我用setInterval運行功能。像這樣:

if ($('#encoding').length) { 

    console.log("auto_update start"); 
    var update = setInterval(auto_update, 12000); 
} 

然後在我auto_update功能發生這種情況

function auto_update() { 

    console.log("auto_update running"); 

    $.ajax({ 
     type: 'POST', 
     url: ajaxurl, 
     data: { 
      action: "dhf_ajax_router", 
      perform: "dhf_check_status", // the function we want to call 
      post_id: $('#post_id').val(), 
      nonce: $('#dhf-video-meta-nonce').val() 
     }, 
     success: function(response) { 

      if (response === "continue") { 

       console.log("still encoding"); 

      } else { 

       clearInterval(update); 
       console.log("complete " + response); 
      } 
     } 
    }); 
} 

的問題是,如果$('#encoding')不存在在開始頁面上,並通過用戶手動內觸發:

$(document).on("click", ".run_encode", function(){ 

     // doing the necessary stuff here. 
     if (response === "sent") { 

       // more stuff 
       var update = setInterval(auto_update, 12000); 
     } 

}); // end .run_encode 

然後clearInterval(update)不起作用,它結束了一個無限循環。

我想不出爲什麼。在兩種情況下都設置了名稱爲update的間隔,那麼爲什麼在第二種情況下清除它不起作用?

+0

關鍵詞:「JavaScript的變量範圍」 – 2012-08-10 07:23:13

回答

2

您必須確保共享變量update是在這兩個範圍內有效。這意味着它或者需要在一個共同的父範圍內,或者您需要使變量成爲全局變量,因此它不會超出範圍。

最有可能的是,您聲明的update位於終止函數中,當該函數終止時,update變量超出範圍並被銷燬。

您可以進行變量的初始設置進入全球範圍內(所以它仍然是可用的,當你調用clearInterval()這樣的:

$(document).on("click", ".run_encode", function(){ 

    // doing the necessary stuff here. 
    if (response === "sent") { 

      // more stuff 
      window.update = setInterval(auto_update, 12000); 
    } 

}); // end .run_encode 

或者,你可以只聲明update變量是全球性的,通過首先將這一在全局級別(任功能外),然後這個代碼將只修改全局變量:

var update; 

$(document).on("click", ".run_encode", function(){ 

     // doing the necessary stuff here. 
     if (response === "sent") { 

       // more stuff 
       update = setInterval(auto_update, 12000); 
     } 

}); // end .run_encode 
+0

感謝您的,我使用的第二示例J最糟糕的問題是,這是一種有效的做事方式,還是我最好擁有某種路由器功能來連續調用所有東西? – deadlyhifi 2012-08-10 11:18:55

+0

@deadlyhifi - 在一段時間內「輪詢」你的服務器,直到它告訴你它已經完成是沒有效率的。你沒有解釋你實際想要解決的問題,所以我不知道如何最好地推薦更好的解決方案。 – jfriend00 2012-08-10 13:57:18

+0

我正在向Zencoder發送一個請求以對視頻文件進行編碼。當我發送它時,我在數據庫中設置了一個標誌來表示它是編碼。完成後,Zencoder發送一個回調,刪除該標誌並填充其他數據(如編碼文件的位置)。我正在輪詢數據庫以查看該標誌是否消失。如果它有,那麼我會得到新的數據並將其放在頁面上。 – deadlyhifi 2012-08-10 14:37:32

4

你聲明函數內部update變量。另一個函數不能訪問它的值。

jfriend00就如何解決它廣泛的答案。我會採取另一條路線:使用setTimeout。無論如何,建議您這麼做,因爲AJAX調用並不是一個固定的時間,而是每次都會變化。想象一下,由於網絡問題,它需要12秒以上:你會被搞砸。

相關問題