Javascript 定期调用AJAX函数是否会降低应用程序的速度?
在我的应用程序中,我在一个特定的页面中连续使用AJAX函数调用,如下所示Javascript 定期调用AJAX函数是否会降低应用程序的速度?,javascript,jquery,ajax,Javascript,Jquery,Ajax,在我的应用程序中,我在一个特定的页面中连续使用AJAX函数调用,如下所示 <script type="text/javascript"> $(document).ready(function(){ setInterval(function() { $.ajax({ url:'clmcontrol_livematchupdate',
<script type="text/javascript">
$(document).ready(function(){
setInterval(function() {
$.ajax({
url:'clmcontrol_livematchupdate',
type:'post',
dataType: 'json',
success: function(data) {
$('#lblbattingteam').html(data.battingnow);
$('#lblscore').html(data.score);
$('#lblwickets').html(data.wickets);
$('#lblovers').html(data.overs);
$('#lblballs').html(data.balls);
$('#lblextras').html(data.extras);
$('#lblrr').html(data.runrate);
$('#lblbowlingteam').html(data.bowlingnow);
$('#lblbowler').html(data.currentbowler);
$('#lblbowlerovers').html(data.bowlerovers);
$('#lblbowlerballs').html(data.bowlerballs);
$('#lblrunsgiven').html(data.runsgiven);
$('#lblextrasgiven').html(data.extrasgiven);
$('#lblwicketstaken').html(data.wicketstaken);
$('#lblecon').html(data.econ);
}
});
}, 4000);
});
</script>
$(文档).ready(函数(){
setInterval(函数(){
$.ajax({
url:“clmcontrol\u livematchupdate”,
类型:'post',
数据类型:“json”,
成功:函数(数据){
$('lblbattingteam').html(data.battingnow);
$('lblscore').html(data.score);
$('lblwickets').html(data.wickets);
$('#lblovers').html(data.overs);
$('#lblball').html(data.balls);
$('lblextras').html(data.extras);
$('#lblrr').html(data.runrate);
$('lblbowlingteam').html(data.bowlingnow);
$('#lblbowler').html(data.currentbowler);
$('#lblbowlerovers').html(data.bowlerovers);
$('#lblbowlerballs').html(data.bowlerballs);
$('#lblrunsgiven').html(data.runsgiven);
$('#lblextrasgiven').html(data.extrasgiven);
$('lblwicketstaken').html(data.wicketstaken);
$('#lblecon').html(data.econ);
}
});
}, 4000);
});
不管怎样,在第一次尝试时,应用程序运行良好,值得到了我预期的更新,但在几次尝试后,值难以更新,进一步的更新没有发生。这是因为函数会因为连续的ajax调用而减慢系统的速度吗 这里有一个潜在的问题,如果您从调试器检查您的网络调用,这个问题会很明显。由于ajax调用的非阻塞异步行为,您有可能同时进行ajax调用。根据您的浏览器,您只能同时拨打如此多的电话,以便他们排队。在这些情况下,也不保证执行命令
在您的情况下,我会在ajax选项中设置
async:false
。通过在setInterval回调中执行,您已经获得了非接口阻塞行为。由于setInterval只是在方法调用之间应用了一个计时器,所以在给定的时间内不会有多个ajax调用在运行(这很可能是问题的罪魁祸首) 这里有一个潜在的问题,如果您从调试器检查您的网络调用,这个问题会很明显。由于ajax调用的非阻塞异步行为,您有可能同时进行ajax调用。根据您的浏览器,您只能同时拨打如此多的电话,以便他们排队。在这些情况下,也不保证执行命令
在您的情况下,我会在ajax选项中设置
async:false
。通过在setInterval回调中执行,您已经获得了非接口阻塞行为。由于setInterval只是在方法调用之间应用了一个计时器,所以在给定的时间内不会有多个ajax调用在运行(这很可能是问题的罪魁祸首) 最好不要使用setInterval(),因为如果第一个请求尚未完成并启动另一个请求,那么最终可能会出现多个请求消耗共享资源并相互饥饿的情况。您可以通过等待计划下一个请求直到最后一个请求完成来避免此问题
试试看:
(function ajaxInterval() {
$.ajax({
url:'clmcontrol_livematchupdate',
type:'post',
dataType: 'json',
success: function(data) {
$('#lblbattingteam').html(data.battingnow);
$('#lblscore').html(data.score);
$('#lblwickets').html(data.wickets);
$('#lblovers').html(data.overs);
$('#lblballs').html(data.balls);
$('#lblextras').html(data.extras);
$('#lblrr').html(data.runrate);
$('#lblbowlingteam').html(data.bowlingnow);
$('#lblbowler').html(data.currentbowler);
$('#lblbowlerovers').html(data.bowlerovers);
$('#lblbowlerballs').html(data.bowlerballs);
$('#lblrunsgiven').html(data.runsgiven);
$('#lblextrasgiven').html(data.extrasgiven);
$('#lblwicketstaken').html(data.wicketstaken);
$('#lblecon').html(data.econ);
},
complete: function() {
// Schedule the next request when the current one has been completed
setTimeout(ajaxInterval, 4000);
}
});
})();
最好不要使用setInterval(),因为如果第一个请求尚未完成并启动另一个请求,那么最终可能会出现多个请求消耗共享资源并彼此饥饿的情况。您可以通过等待计划下一个请求直到最后一个请求完成来避免此问题 试试看:
(function ajaxInterval() {
$.ajax({
url:'clmcontrol_livematchupdate',
type:'post',
dataType: 'json',
success: function(data) {
$('#lblbattingteam').html(data.battingnow);
$('#lblscore').html(data.score);
$('#lblwickets').html(data.wickets);
$('#lblovers').html(data.overs);
$('#lblballs').html(data.balls);
$('#lblextras').html(data.extras);
$('#lblrr').html(data.runrate);
$('#lblbowlingteam').html(data.bowlingnow);
$('#lblbowler').html(data.currentbowler);
$('#lblbowlerovers').html(data.bowlerovers);
$('#lblbowlerballs').html(data.bowlerballs);
$('#lblrunsgiven').html(data.runsgiven);
$('#lblextrasgiven').html(data.extrasgiven);
$('#lblwicketstaken').html(data.wicketstaken);
$('#lblecon').html(data.econ);
},
complete: function() {
// Schedule the next request when the current one has been completed
setTimeout(ajaxInterval, 4000);
}
});
})();
我假设系统可以每4秒钟处理一次ajax调用,除非很多人使用相同的脚本。建议:除非值实际包含需要解析的HTML,否则使用
.text()
而不是.HTML()
。插入文本而不进行解析应该更快。ajax
不是即时的。因此,对于慢速连接,setInterval
将在先前的ajax调用完成之前对其进行排队。改用回调队列。@zzbov我该怎么做?请你解释一下,因为我是ajax新手。或者,使用WebSocket来打开与服务器的直接连接,而不是使用轮询系统。我假设系统可以每4秒处理一次ajax调用,除非很多人使用相同的脚本。一个建议是:除非值实际上包含需要解析的HTML,否则使用.text()
而不是.HTML()
。插入文本而不进行解析应该更快。ajax
不是即时的。因此,对于慢速连接,setInterval
将在先前的ajax调用完成之前对其进行排队。改用回调队列。@zzbov我该怎么做?请你解释一下,因为我是Ajax的新手。或者,使用WebSocket来打开与服务器的直接连接,而不是使用轮询系统。