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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top