Consecutive requests with XMLHttpRequest under IE

R

Robloche

Hi,

I wrote a class to handle requests from the client-side. In particular,
I use :

fuction myClass() {
// ...
this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
// ...
}

In the first implementation of this class, I only instantiated
this.xhr_object (as shown above) once, when a "myClass" object was
created. But then, it happened that I couldn't perform more than one
request with this object : from the second request, the function
onreadystatechange would never be called (I made many tests to be sure
of that).

So I changed my class and now I create a new object (with
this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");) every time a
request is made. And it works.

So my question is :
Is this behavior normal or have I miss something ?

(In fact, my class is a wrapper for IE and Firefox and under Firefox
this problem doesn't exist : Once you have your HTMLHttpRequest object,
you can make as many requests as you want.)
Thank you all for your (future) answers !
 
M

Martin Honnen

Robloche wrote:

I wrote a class to handle requests from the client-side. In particular,
I use :

fuction myClass() {
// ...
this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
// ...
}

In the first implementation of this class, I only instantiated
this.xhr_object (as shown above) once, when a "myClass" object was
created. But then, it happened that I couldn't perform more than one
request with this object : from the second request, the function
onreadystatechange would never be called (I made many tests to be sure
of that).

No problem here with IE 6 and the following:

var httpRequest = new ActiveXObject('Microsoft.XMLHTTP');

for (var i = 0; i < 2; i++) {
httpRequest.open('GET', location.href, true);
httpRequest.onreadystatechange = function () {
if (httpRequest.readyState == 4) {
alert(httpRequest.responseText);
};
};
httpRequest.send(null);
}

the alert shows up twice.

I suspect you set the onreadystatechange handler only once but do
several open/send calls then, I think that is a problem with older
versions of MSXML. So it shouldn't be necessary to create a new object
each time you want to make a request but to ensure that after each open
call the onreadystatechange handler is set.
 
R

Robloche

First of all, thank you very much for your answer.
I tried your little piece of code and, of course, it worked.
But as soon as I put it in a class, the bug occurs. Here's my code :

function CreateXMLHTTPRequestObject() {
this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");

this.doRequest = function(url) {
//this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");

var obj = this;
this.xhr_object.onreadystatechange = function() {
alert("onreadystatechange\nreadyState :
"+obj.xhr_object.readyState);
if(obj.xhr_object.readyState == 4)
alert(obj.xhr_object.responseText);
}

this.xhr_object.open('GET', url, true);
this.xhr_object.send(null);
}
}

var req = new CreateXMLHTTPRequestObject();
req.doRequest(location.href);
req.doRequest(location.href);



As it is, only the first request succeeds. In the second one, the first
alert in the onreadystatechange function never shows up...

But if I uncomment the first line of the function doRequest(url), then
the two requests succeed and all the alerts show up.
What's wrong with my class ?
 
M

Martin Honnen

Robloche wrote:

But as soon as I put it in a class, the bug occurs. Here's my code :

function CreateXMLHTTPRequestObject() {
this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");

this.doRequest = function(url) {
//this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");

var obj = this;
this.xhr_object.onreadystatechange = function() {
alert("onreadystatechange\nreadyState :
"+obj.xhr_object.readyState);
if(obj.xhr_object.readyState == 4)
alert(obj.xhr_object.responseText);
}

this.xhr_object.open('GET', url, true);
this.xhr_object.send(null);

I would change the order as follows (first open(), then setting
onreadystatechange, then send()):

this.xhr_object.open('GET', url, true);

var obj = this;
this.xhr_object.onreadystatechange = function() {
alert("onreadystatechange\nreadyState : "+obj.xhr_object.readyState);
if(obj.xhr_object.readyState == 4)
alert(obj.xhr_object.responseText);
}

this.xhr_object.send(null);


Then it works here for me with IE 6 for both requests.
 
R

Robloche

Thank you !!!
It was so simple... I feel kind of dumb... :eek:/

But why does it work only once when the onreadystatechange is set
before opening ?
I went through many web pages that deal with this and I found either
this order or the other one.
Anyway, you saved me hours of debugging, so thanks again !
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top