L'invio di messaggi al server con la cometa di lungo polling
-
16-09-2019 - |
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"?
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.