Domanda

Qual è il modo migliore per inviare i dati dal client al server?

Il codice di esempio che sto utilizzando è da Come implemento di base "Polling Long"?

È stato utile?

Soluzione 3

Sì, basta usare la seconda connessione al server. Questo è ciò che la maggior parte dei quadri fanno, compreso il IIRC Bayeux protocollo . Se si scopre che è effettivamente necessario che secondo collegamento, preoccupare poi.

Ecco un po 'di codice a lungo polling modificato dal mio link qui sopra:

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

Cosa Moishe stava parlando con la coda è che js non garantisce che XHR saranno ricevuti nell'ordine in cui li spedito. I messaggi non verranno persi (o almeno non sono stati nelle mie prove), e questo non è un problema specifico a lungo polling, ma qualcosa di prendere in considerazione ogni volta che si utilizza per inviare XHR.

Quindi, ecco il codice della coda:

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

Due cose da notare. In primo luogo, c'è un bel po 'di ritardo, se si sta inviando molti messaggi e la coda si sta riempiendo. E 'meglio trovare un modo per inviare l'intera coda di volta in volta, piuttosto che pezzo per pezzo. Un modo per farlo è quello di convertire i messaggi in un array JSON, e decodificare sul server.

In secondo luogo, se c'è un errore durante l'invio del messaggio, allora hai perso il messaggio. Ci deve essere un po 'di codice che sarà o spingere il messaggio non riuscito di nuovo nella coda, o non rimuoverlo prima c'è il successo.

Altri suggerimenti

Basta usare XHR di fare un post.

Un problema è su alcuni browser si può avere solo 2 (o qualche numero n) connessioni XHR simultanee per server. È possibile aggirare questo facendo una coda che ti permette di pubblicare tutti i messaggi in attesa quando la corrente XHR completa, quindi riempire una nuova coda fino a quel post completa, e avanti e indietro.

L'invio di dati al server è solo una richiesta standard. XHR va bene, o JSONP, qualunque sia la vostra barca galleggia.

Non confondersi dal lungo polling; il lungo polling esiste solo come un modo per inviare dal server al client. L'invio dei dati dal client al server è che il web è stato di circa fin dalla sua nascita, e una richiesta XHR normale è tutto ciò che serve.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top