2013-10-29 114 views
0

我想利用服務器發送的事件來處理客戶端的一些異步操作即時通訊服務器端。滾動到底部以查看最終問題。服務器發送事件的自定義事件

我擁有的是一個需要全局搜索的web應用程序。返回可能很大,並且需要一些時間,因爲它們實際發送到Web服務,然後以XML形式返回。

我想使用服務器發送的事件(javascript:EventSource)來啓用此功能。它只適用於一個事件,但如果我想要做一堆不同的事件,它會變得有點奇怪,至少對我而言。我是上交所新手。

到目前爲止,我已經做到了這一點:

var sse = new EventSource('testsse.aspx'); 

function init() { 
      sse.onopen = function (e) { 
       console.log(e.data); 
      }; 

      sse.onmessage = function (e) { 
//if data has been returned the "data:" field will not be empty so we know the server operation is complete. 
       if (e.data.length>0) { 
        $('#rgCcr').kendoGrid({ 
         dataSource: JSON.parse(e.data) 
        }); 
        sse.close(); 
       } 
        console.log("message: " + e.data); 
      }; 

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

我有一個正在建設的JSON字符串的aspx頁面的服務器上。正如我所提到的,如果我只是使用標準的「數據:我的消息\ n \ n」格式,我的工作效果很好。我需要做的是在那裏獲得更多信息。

spec for SSE表示您可以指定要觸發的事件。我不能讓這個工作到目前爲止。

在我的aspx我建立的字符串是這樣的:

json = string.Format("id:{0}\n event:myEvent\n data:{1}\n\n", id, ser.Serialize(ccrData)); 

我曾嘗試創建一個自定義事件,但我不知道怎麼做才能抓住它綁定到。

在頁面上,我有5個不同的區域被搜索作爲全球搜索的一部分。每一個都是作爲服務器上的異步任務執行的,當它們完成後,它們將把數據發送回客戶端。一旦客戶端檢測到事件已提交數據,它將關閉監聽器並將數據結果添加到劍道網格中。

如何使用SSE的事件字段來區分什麼會回來?

+0

不是一個答案,但http://signalr.net/不是可以解決問題了嗎? – Rudy

回答

0

而不是使用「onmessage」函數,你可以嘗試註冊一個事件監聽器。這樣你就可以選擇傾聽特定的事件類型。

es = new EventSource('/events', withCredentials: true); 

es.addEventListener("open", function (e) { 
    alert("Connecting..."); 
}); 

es.addEventListener("error", function (e) { 
    alert("Error"); 
}); 

es.addEventListener("myEvent", function (e) { 
    alert("MyEvent"); 
    alert(e.data); 
}); 

這裏有豐富的文檔: http://html5doctor.com/server-sent-events/