【发布时间】:2018-01-11 01:36:21
【问题描述】:
我正在用 PhP 开发一个聊天,我正在做长轮询以检查服务器上的新消息。在执行长轮询的 Ajax 请求中,服务器最多检查 25 秒是否有新的注册消息。在服务器到达时,它不会向 javascript 返回任何内容,如果我发送新请求,浏览器会等待检查完成发送新消息
chat.js
function sndmessage(message, idchat) {
if (message != "") {
var $this = $('.chat .msgs');
var indice = 0;
var msg = message;
$('#sendmsg').val("");
$.ajax({
url: "../ajax/sendmessage.ajax.php",
type: "POST",
data: {
"message": msg,
"id": id
},
success: function(response) {
return;
}
});
}
return true;
}
function polling(idm, idu) {
var interval;
$.ajax({
async: true,
url: "../ajax/polling.ajax.php",
data: {
"idm": idm,
"idu": idu
},
type: "POST",
dataType: "JSON",
success: function(response) {
clearInterval(interval);
if (response.response == false) {
interval = setTimeout(function() {
polling(idm, idu);
}, 500);
} else {
if ('id' in response[0][0]) {
for (var i = 0; i < response[0].length; i++) {
if (mensagensIDs.indexOf(response[0][i]['id']) < 0) {
mensagensIDs.push(response[0][i]['id']);
let data = response[0][i]['data'].split(" "),
dia = data[0].split("-").reverse().join().replaceAll(",", "/"),
hora = data[1].split(":").slice(0, 2).join(":"),
mensagem = response[0][i]['mensagem'],
remetente = (response[0][i]['remetente'].indexOf(" - ") > 0) ? "admin" : "usuario",
destinatario = (response[0][i]['destinatario'].indexOf(" - ") > 0) ? "admin" : "usuario",
id = response[0][i]['id'];
let d = new Date();
let html = (d.getDate() == dia.split("/")[0]) ? hora : dia + " - " + hora;
chats.push({
"idu": idu,
"chat": {
"id": id,
"class": (remetente == "admin") ? "msg-adm teal lighten-1" : "msg-eu",
"class2": (remetente == "admin") ? "white-text" : "blue-text text-darken-2",
"msg": mensagem,
"tooltip": html,
"tooltippos": (remetente == "admin") ? "right" : "left"
}
});
if (idu == chatatual) {
$('.chat .msgs').append('<div id="' + idu + '" class="col s12">\
<div class="' + ((remetente == "admin") ? "msg-adm teal lighten-1" : "msg-eu") + ' z-depth-1">\
<span class="tooltipped pointer ' + ((remetente == "admin") ? "white-text" : "blue-text text-darken-2") + '" data-position="' + ((remetente == "admin") ? "right" : "left") + '" data-delay="50" data-tooltip="' + html + '">' + mensagem + '</span>\
</div>\
</div>').animate({
scrollTop: $('.msgs').prop("scrollHeight")
}, 500);
} else {
$('li.collection-item.avatar#' + idu).find('.badge').text("New message");
}
}
}
interval = setTimeout(function() {
polling(mensagensIDs[mensagensIDs.length - 1], idu);
}, 500);
} else {
interval = setTimeout(function() {
polling(idm, idu);
}, 5000);
}
}
}
});
}
我想知道如何在不等待其他请求的情况下发送请求
【问题讨论】:
-
您应该考虑使用 WebSockets。 developer.mozilla.org/en-US/docs/Web/API/WebSockets_API
-
对于一个问题要呈现大量的代码。您是否考虑过为您的问题发送minimal reproducible example?
-
这将使您的聊天应用更加更好用,而且他们有免费套餐:pusher.com
标签: javascript php jquery ajax