我的项目基本上就像是实时更新的Reddit Feed。我正在尝试使用AJAX一次轮询服务器,以便一次更新15个项目。
我写了一个for循环,但它导致浏览器锁定(我猜太多的XHR?)。
如何在不锁定浏览器的情况下轮询Reddit-esque Feed上的每个项目?最有效的方法是什么?
如果有100多个客户同时使用网络应用,我应该使用长轮询吗?或者我应该选择智能轮询(如果没有数据,增加请求之间的等待时间)?
谢谢!我还是AJAX的新手!
for (var i=0; i < id_array_len; i++) {
// Grab current reply count
var reply = $("#repl"+item_id).html();
var url= *php function here*
var ajaxRequest;
try{
// Opera 8.0+, Firefox, Safari
ajaxRequest = new XMLHttpRequest();
} catch (e){
// Internet Explorer Browsers
try{
ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try{
ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e){
// Something went wrong
alert("Your browser does not support AJAX!");
return false;
}
}
}
ajaxRequest.onreadystatechange = function(){
if (ajaxRequest.readystate == 4){
live_feed_data_tot = ajaxRequest.responseText;
if (live_feed_data_tot.trim() == "no change" || live_feed_data_tot.trim() == "no meme" || live_feed_data_tot.trim() == "no response"){
console.log("(no update)");
} else {
var live_feed_data = live_feed_data_tot.split(',');
if (live_feed_data[1] == 'reply') {
// Reply count has changed
new_reply = live_feed_data[0].trim();
// Update actual number
$("#repl"+item_id).html(new_reply);
}
}
}
}
ajaxRequest.open('POST', url, true);
ajaxRequest.send();
答案 0 :(得分:2)
使用longpolling with long(当然适合你的app)超时。你的电话当然需要异步。只要没有数据要传递,服务器就会保留应答,直到即将达到超时。一旦客户得到答案,就会触发complete()
- Block中的下一个长点。这样,您可以最大限度地减少请求数量。
您的代码应如下所示:
function doAjaxLongpollingCall(){
$.ajax({
url: "...",
timeout: <prettylong>,
success: function(){
//process your data
},
complete: function(){
doAjaxLongpollingCall();
}
});
}
答案 1 :(得分:0)
如果你做了很多用户,请切换到socket.io并省去麻烦。它使用websockets(使用推送机制)并且可以回退到其他机制,如闪存套接字或长轮询,如果浏览器中没有这些机制。需要您在node.js中创建这个应用程序。