【发布时间】:2019-01-16 08:26:42
【问题描述】:
我正在尝试构建我自己的 jquery ajax 聊天,它是当消息像 facebook 一样时的实时通知。计划是每 5 秒调用一次 ajax 请求,最后我的计划按我的预期运行良好。 但是在发送消息超过 5 次后,我的应用程序性能出现问题。当用户在输入框中输入消息时,浏览器变得很慢。 至少我在做以下方式:
//function to updating html element when new message comes (DOM operation)
function refresh_messanger(){
$(".dialogdiv").remove();
var y=get_update_message_in_messanger();
for(var i=0; i<= y.length-1; i++){
var message=y[i].message_content;
var message_date=y[i].message_date;
var src="";
if(y[i].photo_profile=='{{session("session_photo_profile")}}'){
src="{{url('uploads/image').'/'.session('session_login')['app_user_id'].'/'.session('session_photo_profile')}}";
}else{
src="{{url('uploads/image')}}/"+y[i].message_from+'/'+y[i].photo_profile;
}
var message_class="";
if(i==0){
message_class="text-bold"
}else{
message_class="text";
}
var messagehtml=['<div class="itemdiv dialogdiv">',
'<div class="user">',
'<img alt="" height="60" width="40" src="'+src+'">',
'</div>',
'<div class="body">',
'<div class="time">',
'<i class="ace-icon fa fa-clock-o"></i>',
'<span class="blue">'+message_date+'</span>',
'</div>',
'<div class="name">',
'<a href="#"></a>',
'</div>',
'<div class="'+message_class+'">'+message+'</div>',
'<div class="tools">',
'<a href="#" class="btn btn-minier btn-info">',
'<i class="icon-only ace-icon fa fa-trash"></i>',
'</a>',
'</div>',
'</div>',
'</div>'].join('\n');
//alert(messagehtml);
$("#message_wall").append(messagehtml);
}
}
//display number of messsage realtime
function get_all_notif_message(){
var number_of_messages=0;
var message_from ="{{$message_from}}";
var message_to ="{{$message_to}}";
var message_url ="{{url('messanger/realtime/message_notification')}}"+"/"+message_from+"/"+message_to;
$.ajax({
url :message_url,
contentType:"application/json",
type :"get",
async :false,
success: function (response) {
var data=JSON.parse(response);
//$("#total_message").val(data.number_of_messages)
//alert(data.number_of_messages)
number_of_messages=data.number_of_messages;
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(textStatus, errorThrown);
}
});
return number_of_messages;
}
//function to handle DOM operatioin base on old number total
function listen_crud(){
var uptodate_message=get_all_notif_message();
$("#uptodate_massage").val(get_all_notif_message());
if($("#total_message").val() < uptodate_message){
//alert("new message received")
`var audio = new Audio('{{url("assets/sound/inquisitiveness.mp3")}}');
audio.play();
$("#total_message").val(uptodate_message);
refresh_messanger();
`var objDiv =` `document.getElementById("message_container");`
objDiv.scrollTo(x-coord, y-coord);
}
}
//first program running
setInterval(listen_crud,5000);
https://pastebin.com/6rhpwCir HTML View related to .dialogdiv class"
请给我你的建议。
【问题讨论】:
-
我的建议是您在函数“get_all_notif_message”中的 ajax 请求不是同步的。正如您所做的那样,您的代码正在等待响应。您应该将更新信使的代码放在 ajax 调用的响应函数中,或者使用承诺。我认为你的表现会更好
-
完全同意班德罗。您应该永远使用
async: false,除非您真的不喜欢使用您的应用程序的人。但在这种情况下,您可能需要考虑使用WebSockets。这样一来,如果有新消息可用,您的服务器会通知浏览器,因此您不必等待 5 秒才能收到消息。 -
@Alimin 确实不能。但是您应该调用另一个函数来处理来自成功回调的响应。
-
@Alimin 您应该重新编写代码以允许 WebSockets,但您可以保留大部分代码。我不太了解 Laravel,但似乎 it supports WebSockets as well。
-
@Alimin 是的,你应该把它放在 AJAX 成功中,但你也可以把它放在一个单独的函数中,然后从你的成功中调用该函数。
标签: jquery ajax performance