2012-01-08 23 views
5

İstemcinin bir sunucuyla WebSockets aracılığıyla iletişim kurabilmesi gereken bir proje üzerinde çalışıyorum. Kullanıcı girdisine son derece duyarlı bir şekilde geliştirdiğimiz uygulamadan dolayı, bir WebWorker'in ağ üzerinden tüm iletişimi yapmasına izin vermeye karar verdik, böylece yavaş bir bağlantı GUI'yi kesemez. Bu çok iyi çalışıyor.JavaScript: Ağ iletişimi için bir kuyruğu kullanma

Artık ağ yavaşsa ve gönderilecek mesajların miktarı yüksekse gerekli olacak optimizasyonları düşündük. Bu mesajların çoğu yalnızca bazı diğer istemciler kullanıcı arayüzünü senkronize edeceğinden, gerektiğinde bazılarını düşürebiliriz. Ancak bunu yapmak için tıkanıklık olduğunda durumları tespit etme olanağına ihtiyacımız var.

Kuyruk fikriyle geldik: Gönderilecek her ileti bir sıraya aktarılır ve WebWorker kuyruğu sürekli olarak yinelemekten ve orada bulduğu tüm iletileri göndermekten başka bir şey yapmaz. Bununla birlikte, sıraya göre belirli sayıda eleman varsa İşçinin farklı davranmasına izin verebiliriz (yani mesajlar çok yavaş gönderilir). Fikir basit ve basittir, ancak uygulama görünmüyor.

var ws; 
var queue = new Array(); 

function processMessageQueue() { 
    while(true) 
     if(queue.length > 0) ws.send(queue.shift()); 
} 

self.addEventListener('message', function(e) { 
    var msg = e.data; 
    switch(msg.type) { 
     case 'SEND': 
      queue.push(JSON.stringify(msg)); 
      break; 
     case 'CREATE_WS': 
      ws = new WebSocket(msg.wsurl); 
      ws.onmessage = function(e) { 
       self.postMessage(JSON.parse(e.data)); 
      } 
      processMessageQueue(); 
    } 
}, false); 

Gördüğünüz gibi

, işçi en kısa sürede bunu yapmak için mesaj aldım olarak WebSocket'e oluşturur. Ardından, verilerini WebSocket üzerinden göndererek sırayı kalıcı olarak boşaltan döngü olan processMessageQueue() işlevini çalıştırır. Şimdi, benim problemim mesajların sıraya itilmesi için bir ihtimal yok gibi görünüyor. Bu, 'SEND' türünde bir mesaj geldiğinde olmalı, ancak İşçi için herhangi bir olayı halletmek için fazla meşgul olamaz. Bu nedenle, her ikisine birden değil, sıraya göre döngü yapabilir veya iletileri gönderebilir.

İhtiyacım olan şey, bu sıradaki verileri bir şekilde itmenin bir yoludur. Eğer bu mümkün değilse, mesajların ne zaman gönderildiklerinin daha çabuk gelip gelmediğini öğrenmek için başka bir yol düşünebilir mi bilmek isterim. Herhangi bir ipucu?

Şimdiden teşekkürler!

cevap

2

Onmessage olayını işlemek için çalışanın zamanını vermelisiniz. while(true) yapmak tüm işlem zamanını alacaktır ve herhangi bir olayın yürütülmesine izin vermeyecektir.

Sen mesela

function processMessageQueue() { 
    if(queue.length > 0) ws.send(queue.shift()); 
    setTimeout(processMessageQueue, 50); 
} 
+0

Aww bunu değiştirebilir, bu çok kolay oldu. Bir çekicilik gibi çalışır, teşekkür ederim! – j0ker