2013-05-10 51 views
0

我有一個通知區域,當有人用例如jQuery或Ajax發送消息時(我的數據庫位於soap服務器中),我希望更新該消息。我想每秒鐘都執行一次soap調用,我該怎麼做?如何使用jQuery實現通知系統?

+1

'setInterval()'或'setTimeout()'?據我所知,在JS中擁有多個線程的唯一方法是使用網絡工作者,但您不需要這樣做。 – nnnnnn 2013-05-10 23:17:42

+2

這與線程有什麼關係? – user151496 2013-05-10 23:19:42

+1

@user一個人不能犯錯誤? – 2013-05-10 23:24:02

回答

3

您可以使用簡單的setInterval結構以預定義間隔執行AJAX調用。類似這樣的:

setInterval(function(){ 
    $.get('ajax_responder.php',dataObj,function(){ 
    // ajax callback 
    // here is where you would update the user with any new notifications. 
    }); 
},5000); 

上述代碼將每隔5000毫秒(每5秒)執行一次AJAX請求。

參考文獻:

+2

儘管使用鏈式'setTimeout's會更聰明,所以它們肯定不會堆積。 – kapa 2013-05-10 23:19:38

+1

@baz - **非常真實**。我沒有多少時間來擴展這一點 - 非常歡迎您對我的回答進行一些修改,以概述該問題。 – Lix 2013-05-10 23:20:16

+0

謝謝你倆:) – 2013-05-10 23:22:17

3

相反的setInterval(),我會強烈建議使用setTimeout()

MDN explanation

如果有你的邏輯可能需要更長的時間比間隔時間來執行 的可能性,建議您遞歸調用使用window.setTimeout一個名爲 功能。例如,如果使用 setInterval每5秒查詢一次遠程服務器,網絡延遲, 服務器不響應,以及其他一系列問題可能會阻止請求在其分配的時間內完成。因此,您自己可能會發現 排隊的XHR請求不一定會以 的順序返回。

對於這種情況,一個遞歸setTimeout圖案是優選的:

(function loop(){  
    setTimeout(function(){ 

     // logic here 

     // recurse 
     loop(); 
    }, 1000); 
})(); 

在上面的代碼中,一個叫函數環被聲明並立即執行。 loop在邏輯完成執行後,遞歸地稱爲 ,內部爲setTimeout。雖然此 模式不保證以固定時間間隔執行,但確實 保證在遞歸之前先前的時間間隔已完成。

1

實時網絡的最佳方式是node.js

Node.js是一個基於Chrome的JavaScript運行時構建的平臺,可輕鬆構建快速,可擴展的網絡應用程序。 Node.js使用事件驅動的非阻塞I/O模型,使其輕量且高效,非常適合跨分佈式設備運行的數據密集型實時應用程序。

但是,您可以通過setInterval or setTimeout來完成,在您的間隔中撥打Ajax電話。

var intval = setInterval(function() 
{ 
    $.get('url.php', {data1: "value1", data2: "value2"}, 
    function(response) 
    { 
      // response 
    }); 
}, 1000);