Pregunta

¿Cuál es la mejor manera de enviar datos del cliente al servidor?

El código de ejemplo que estoy usando es ¿Cómo implemento "encuestas largas" básicas?

¿Fue útil?

Solución 3

Sí, solo use la segunda conexión al servidor. Esto es lo que hacen la mayoría de los marcos, incluido IIRC el Protocolo de Bayeux. Si descubre que realmente necesita esa segunda conexión, preocuparse por ello.

Aquí hay un código de vela larga modificado de mi enlace anterior:

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);

De lo que Moishe estaba hablando con la cola es que JS no garantiza que se reciban XHRS en el orden en que los envió. Los mensajes no se perderán (o al menos no han estado en mis pruebas), y este no es un problema específico de cola larga, sino algo a considerar cada vez que usa XHR para enviar.

Así que aquí está el código de cola:

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();
};

Dos cosas a tener en cuenta. Primero, hay un poco de retraso si está enviando muchos mensajes y la cola se está llenando. Es mejor encontrar una manera de enviar toda la cola cada vez, en lugar de pieza por pieza. Una forma de hacer esto es convertir los mensajes en una matriz JSON y decodificar en el servidor.

En segundo lugar, si hay un error que envía el mensaje, entonces ha perdido el mensaje. Debe haber un poco de código que empuje el mensaje fallido nuevamente a la cola o no lo elimine hasta que haya éxito.

Otros consejos

Solo usa XHR para hacer una publicación.

Un problema es en algunos navegadores, solo puede tener 2 (o algún número N) conexiones XHR concurrentes por servidor. Puede trabajar alrededor de esto haciendo una cola que le permite publicar todos los mensajes de espera cuando se completa el XHR actual, luego llenando una nueva cola hasta que se complete esa publicación, y de ida y vuelta.

Enviar datos al servidor es solo una solicitud estándar. XHR está bien, o JSONP, lo que sea que flote en su bote.

No te confundas por los versiones largas; El contaminado largo solo existe como una forma de enviar desde el servidor al cliente. Enviar datos del cliente al servidor es de lo que ha sido la web desde su inicio, y una solicitud de XHR normal es todo lo que necesita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top