2010-04-09 65 views
2

我正在寫一個聊天AJAX應用程序。隨機地,在FF 3.5.9中,setInterval()似乎停止發射。我的代碼中沒有任何地方有clearInterval()。什麼可能導致這種情況發生?JavaScript:什麼會導致setInterval停止射擊?

$(document).ready(function() { 

    $("#no-js-warning").empty(); 

    messageRefresher = new MessageRefresher(0); 
    setInterval($.proxy(messageRefresher, "refresh"), 2000); 
}); 

function notifyInRoom(user) { 
    $.getJSON('API/users_in_room', { room_id: $.getUrlVar('key'), username: user }, function (users) { 
     if (!$.isEmptyObject(users)) { 
      $("#users").empty(); 
      $.each(users, function (index, username) { 
       var newChild = sprintf("<li>%s</li>", username); 
       $("#users").append(newChild); 
      }); 
     } 
     else { 
      $("#users-loading-msg").text("No one is in this room."); 
     } 
    }); 
} 

function MessageRefresher(latest_mid) { 
    this._latest_mid = latest_mid; 
} 

MessageRefresher.prototype.refresh = function() { 
    notifyInRoom($("#user-name").val()); 

    var refresher = this; 
    $.getJSON('API/read_messages', { room_id: $.getUrlVar('key'), mid: refresher._latest_mid }, function (messages) { 
     if (! (messages == null || $.isEmptyObject(messages[0]))) { // messages will always be at least [[], [], 0] 
      $("#messages-loading-msg").hide(); 
      for (var i = 0; i < messages[0].length; i++) { 
       var newChild = sprintf('<li><span class="username">%s:</span> %s</li>', messages[1][i], messages[0][i]); 
       $("#messages").append(newChild); 
      } 
      refresher._latest_mid = messages[2]; 
      setUserBlockClass(); 
     } 
     else { 
      $("#messages-loading-msg").text("No messages here. Say anything..."); 
     } 

    }); 
} 

// Give the end-user-block class to the appropriate messages 
// eg, those where the next message is by a different user 
function setUserBlockClass() { 
    $("#messages li").each(function (index) { 
     if ($(this).children(".username").text() != $(this).next().children(".username").text()) { 
      $(this).addClass("end-user-block"); 
     } 
    }); 
} 

我檢查了Firebug中的最近的回覆,它與之前發送的回覆相同。 (所以,這不是一個不尋常的響應造成的崩潰。)

如果我刷新頁面,電話恢復。

我在開發的時候在Firebug中設置斷點,然後取消設置它們並點擊「繼續」。有沒有可能導致這個問題? 更新:隨着更多的測試,這似乎可能是問題。

我也在其他瀏覽器中使用該服務,並且通話繼續進行。

+0

你有任何腳本錯誤?如果您添加「警報」呼叫會發生什麼? – SLaks 2010-04-09 00:53:47

+0

沒有腳本錯誤。尚未嘗試警報呼叫。 – 2010-04-09 00:54:36

+0

更好的是用Firebug調用console.log'。 – 2010-04-09 01:23:10

回答

1

我在用Firebug調試時看到setInterval停止。假設它是一個時間/中斷的事物,只要我沒有跨越斷點就可以正常工作。

+0

我在Firefox 3.6中看到這個。打破Firebug殺死間隔計時器。在Firefox 5.0中,打破Firebug殺死mozRequestAnimationFrame,推測是出於同樣的原因。請參閱http://code.google.com/p/fbug/issues/detail?id=2894&q=setinterval&colspec=ID%20Type%20Status%20Owner%20Test%20Summary – mhenry1384 2011-08-10 18:03:57

0

一兩件事來檢查,我只是跑進是,如果你正在檢查的setInterval是否有效的東西,如:

console.log("X"); 

螢火蟲將只顯示「X」一次。 Firebug似乎拒絕將相同的文本記錄兩次。但是,Chrome控制檯中的測試運行良好。

當我改變了我的測試代碼:

console.log(new Date()); 

螢火蟲給我我所期望的結果。