Enviando mensagens para o servidor com o cometa-polling
-
16-09-2019 - |
Pergunta
Qual é a melhor maneira de enviar dados do cliente para o servidor?
O código de exemplo que estou usando é de Como faço para implementar a "pesquisa longa" básica?
Solução 3
Sim, basta usar a segunda conexão com o servidor. É isso que a maioria das estruturas faz, incluindo iirc o Protocolo Bayeux. Se você descobrir que realmente precisa dessa segunda conexão, preocupe -se com isso.
Aqui está algum código de polução longa modificada no meu link acima:
var userid = Math.ceil(1000000*Math.random()).toString(16).toUpperCase();
var startLongpoll = function() {
$.ajax({
type:"POST", async:true, cache:false, timeout:0,
data: {userid: userid},
success: function(data){
_outCallback(data);
setTimeout( startLongpoll, 10 );
},
error: function(xhr, textStatus, errorThrown){
_errCallback(textStatus+" ("+errorThrown+")");
setTimeout( startLongpoll, 5000 );
},
});
};
setTimeout(startLongpoll,10);
O que Moishe estava falando com a fila é que o JS não garante que o XHRS seja recebido na ordem em que você os despacou. As mensagens não serão perdidas (ou pelo menos elas não estiveram nos meus testes), e esse não é um problema específico, mas algo a considerar sempre que você usa o XHR para enviar.
Então, aqui está o código da fila:
var queue = [];
var busy = false;
this.send = function(msg) {
queue[queue.length] = msg;
if (busy) return;
busy=true;
var s = function() {
var m = queue.shift();
$.ajax({
type:"POST", async:true, cache:false, timeout: 5000,
data: {userid:userid, msg:m},
error: function(xhr, textStatus, errorThrown){
_errCallback(textStatus + " (" + errorThrown + ")");
if (queue.length>0) s(); else busy = false;
},
success: function(){
if (queue.length>0) s(); else busy = false;
}
});
}
s();
};
Duas coisas a serem observadas. Primeiro, há um pouco de atraso se você estiver enviando muitas mensagens e a fila está preenchendo. É melhor encontrar uma maneira de enviar toda a fila a cada vez, em vez de peça por peça. Uma maneira de fazer isso é converter as mensagens em uma matriz JSON e decodificar no servidor.
Segundo, se houver um erro de envio da mensagem, você perdeu a mensagem. É preciso haver um pouco de código que empurre a mensagem com falha de volta para a fila ou não a remova até que haja sucesso.
Outras dicas
Basta usar o XHR para fazer uma postagem.
Um problema é em alguns navegadores que você pode ter apenas 2 (ou algum número n) conexões XHR simultâneas por servidor. Você pode contornar isso fazendo uma fila que permite postar todas as mensagens de espera quando o XHR atual concluir e, em seguida, preenchendo uma nova fila até que essa postagem seja concluída e para frente e para trás.
O envio de dados para o servidor é apenas uma solicitação padrão. XHR está bem, ou JSONP, o que quer que flutua seu barco.
Não se confunda com a longa polação; A polpa longa existe apenas como uma maneira de enviar do servidor para o cliente. Enviar dados do cliente para o servidor é o que a Web tem desde a sua criação, e uma solicitação XHR normal é tudo o que você precisa.