2010-03-15 21 views
0

在我的應用程序中,我每秒輪詢webserver的消息並在前端顯示它們。 我使用setInterval來實現這一點。但是,只要用戶停留在該頁面上,即使沒有數據,客戶端也會繼續使用請求輪詢服務器。當通過設置變量不再生成更多消息時,服務器會發出提示。 我想用這個變量clearInterval並停止計時器,但沒有奏效。在這種情況下我還能使用什麼? 我正在使用jquery和django。這裏是我的代碼:setInterval替代

 
jquery: 
var refresh = setInterval(
     function() 
      { 
       var toLoad = '/myMonitor'+' #content';    
       $('#content').load(toLoad).show(); 

      }, 1000); // refresh every 1000 milliseconds 
    }); 

html: 
div id=content is here 

我可以訪問django變量在html中完成每個刷新。我如何設置clearInterval?

注:堆棧溢出不會讓我把爲& GT & LT這樣的HTML是不完整的

感謝

更新2010年3月16日 我必須做一些錯誤的。但無法弄清楚。這是我與clearTimer的腳本,它不起作用。

 

var timer = null; 
$(function(){ 
     if ("{{status}}" == "False") 
     { 
      clearInterval(timer); 
     } 
     else 
     { 
      timer = setInterval(
       function(){ 
        var toLoad = '/myMonitor'+' #content'; 
        $('#content').load(toLoad).show();} 
        ,1000); // refresh every 1000 milliseconds 
     } 
    }); 

status是一個在「views.py」(Django)中設置的布爾值。 謝謝你一堆。

+1

您可能會考慮研究Django和jQuery Comet實現以獲得更好的服務器輪詢。 http://www.rkblog.rk.edu.pl/w/p/django-and-comet/ - http://plugins.jquery.com/project/Comet – 2010-03-15 17:01:02

+0

什麼「沒有工作」清除間隔計時器?這對我來說總是有效的。也許你做這件事的方式有點不對。 – Pointy 2010-03-15 17:12:18

+0

謝謝你們,我會看看Comet的實現。 尖尖的, 我正在訪問Django模板中的變量{{result}}。我試着用「if」和「while」循環在Jquery中檢查這一點,並清除間隔,但這不起作用。我很可能做錯了。請你能指點一下我應該把支票放在哪裏或怎麼放? 謝謝 – spyder 2010-03-15 17:30:11

回答

3

有幾個人已經回答了你的問題的具體資源,所以我想我會提供一些背景知識。

總之,您希望服務器將數據推送到瀏覽器以避免廣泛的客戶端輪詢。沒有一種好的跨瀏覽器方式來支持服務器推送,因此一個需要少得多投票的常見解決方案是使用Comet(另一種清潔產品,如AJAX)長時間輪詢技術。

使用Comet,瀏覽器發出請求,並且服務器保持連接打開,直到有新數據可用爲止。當服務器確實有有新數據時,它通過打開的連接發送它,並且瀏覽器馬上收到它。如果連接超時,瀏覽器將打開一個新的連接。這可以讓服務器在客戶端可用時立即向客戶端發送數據。正如其他人所指出的,這種方法需要對您的Web服務器進行特殊配置。您需要一個服務器上的腳本,該腳本每隔一段時間檢查一次數據,並在客戶端存在時響應客戶端。

需要注意的是,大多數Web服務器都是爲了從客戶端獲得請求並儘快響應而構建的,他們不打算長期保持活力。有了Comet,你將擁有比平常更開放的連接,可能會消耗比預期更多的資源。

+0

感謝瑞安對此詳細的解釋。理想情況下,我不想要長時間開放的連接,並且我沒有像聊天會話那樣的突發流量。我有一段特定的時間持續發出消息。任何其他方法? – spyder 2010-03-15 17:36:55

0

您的clearInterval檢查僅檢查文檔就緒事件何時被觸發。

如果您提供的代碼正是瀏覽器中的代碼,那麼您將字符串「{{status}}」與字符串「False」進行比較。我寧願看油漆幹,而不是等待評估爲真。

如果您的請求花費超過1秒的時間完成,該怎麼辦? :你會用請求氾濫你的服務器。

function update() { 
    $('#content').show().load('/myMonitor'+' #content', function (response, status) { 
    if (!/* whatever you're trying to check*/) { 
     setTimeout(update, 1000); 
    }; 
    }); 
}; 

$(document).ready(function() { 
    update(); 
}); 

比您所在的位置更近,但您仍然需要確定如何決定何時停止輪詢。