J'essaie d'implémenter un client de chat en utilisant JavaScript. Le client est construit en utilisant le constructeur suivant:XmlHttpObject ne change pas son readyState
function ChatClient(endpointUrl) {
this.xmlHttp = createXmlHttpRequest();
this.endpointUrl = endpointUrl;
me = this;
setInterval('me.receiveMessages()', FETCH_MESSAGES_INTERVAL);
}
function createXmlHttpRequest() {
/* Create a new XMLHttpRequest object to talk to the Web server */
var xmlHttp = false;
/* @cc_on @ */
/*
* @if (@_jscript_version >= 5) try { xmlHttp = new
* ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlHttp = new
* ActiveXObject("Microsoft.XMLHTTP"); } catch (e2) { xmlHttp = false; } }
* @end @
*/
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}
return xmlHttp;
}
Le client de messagerie instantanée devrait être en mesure de demander des messages à partir du serveur dans un intervalle défini par l'FETCH_MESSAGES_INTERVAL
. Voici le code:
ChatClient.prototype.receiveMessages = function() {
this.xmlHttp.open('GET', this.endpointUrl, true);
this.xmlHttp.onreadystatechange = this.handleReceiveMessagesResponse();
this.xmlHttp.send(null);
}
ChatClient.prototype.handleReceiveMessagesResponse = function() {
console.log("readyState = " + this.xmlHttp.readyState);
if (this.xmlHttp.readyState == 4) {
var rawResponse = this.xmlHttp.responseText;
document.getElementById('OutputArea').textContent = rawResponse;
}
}
Le problème est que lorsque l'handleReceiveMessagesReponse est appelée, le cosole Firebug montre que this.xmlHttp.readyState est toujours 1 (chargement). FireBug montre également que mes requêtes GET reçoivent les réponses attendues du serveur (statut 200 avec la chaîne 'Hello' comme corps). Est-ce que quelqu'un sait ce qui ne va pas avec ce code?
Cela a fonctionné, merci! Une dernière question de quelqu'un qui est nouveau pour javascript et ajax: est-ce une pratique courante pour implémenter un gestionnaire de réponse comme une fermeture, ou il y a une faille dans ma conception de chat? –
Pratique courante de nos jours de ne pas essayer de construire ce genre de code vous-même, mais d'utiliser un cadre existant comme JQuery qui simplifie énormément ce genre de chose. Cela étant dit, je n'utilise pas JQuery après avoir passé de nombreuses années à mettre en place un cadre interne et, oui, de telles implémentations utilisent des fermetures à bon escient. – AnthonyWJones