473,386 Members | 1,673 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,386 software developers and data experts.

As

JT
Asynchronous JavaScript

I am building a Web App which relies heavily on asynchronous
javascript (XMLHttpRequest).

It works a beautifully in IE7 and FF 2+ , but in IE6 (6.0.2900.2180
((sp2)) even though the asynchronous flag is set to true the call is
synchronous and doesn’t fork!! This problem is sporadic, only
happening on some peoples PCs some of the time and not others (with
the same full version as seen in Help->About). My code to test and
demonstrate this is as follows:.

The variables onExitRoot and callerHasLeft are used to test if the
Http Request was processed asynchronously..

Any ideas why this doesn’t work on some versions of IE6…

try
{
var onExitRoot = false;
var callerHasLeft = false;

var req = CTalk.getHTTPReq(); //get XMLHttpRequest or throw exception
if not supported
var reqStage1OK = false;

var to = setTimeout(function() { req.abort(); if(reqStage1OK)
CTalk.displayErrOnCon(CTalk._M_ERRCON_TYPE_INCOMPL ETE); else
CUi.displayMsg("Error Connecting to X!",true); },
CTalk.respWaitASTol);

var url = "req.php?CID=" + escape(CTalk._M_CLIENT_ID) + "&M=" +
escape(mtype + param);
CUtil.log("opening ASync req: " + url);
req.open("GET", url, true);

req.onreadystatechange = function()
{
try
{
if(req)
{
CUtil.log("sendAsyncReq state : " + req.readyState);

if(req.readyState==1)
reqStage1OK = true;
else if(req.readyState==4)
{
if(req.status==200)
{
clearTimeout(to);
CUtil.log("HTTP 200 from sendAsyncReq, done.");
callback(req.responseText);
onExitRoot=true;
}
else
{
clearTimeout(to);
CUtil.log("HTTP/1.1 ERR from sendAsyncReq.");
try { CUi.displayMsg("Error",true); req.abort(); } catch(err) {}
onExitRoot=true;
}
}
}
} catch(e) { CUtil.log(e.message); alert("ERR: " + e.message); }
}

CUtil.log("About to send data request");
req.send(null);

if(onExitRoot && !callerHasLeft)
{
CUtil.log("Async not working!!");
//IF we get here async didn't work!!
//THis case is hit in IE6 on one call and then on a
subsiquent call it is not hit.
}

callerHasLeft = true;
} catch(e) { CUtil.log(e.message); alert("ERROR: " + e.message); }


Oct 6 '08 #1
3 1426
JT <ja***************@gmail.comwrites:
Asynchronous JavaScript

I am building a Web App which relies heavily on asynchronous
javascript (XMLHttpRequest).

It works a beautifully in IE7 and FF 2+ , but in IE6 (6.0.2900.2180
((sp2)) even though the asynchronous flag is set to true the call is
synchronous and doesn’t fork!! This problem is sporadic, only
happening on some peoples PCs some of the time and not others (with
the same full version as seen in Help->About). My code to test and
demonstrate this is as follows:.

The variables onExitRoot and callerHasLeft are used to test if the
Http Request was processed asynchronously..

Any ideas why this doesn’t work on some versions of IE6…
You will probably run into this not only on IE6, but one thing I've
noticed that some IE versions run the onreadstatechange handler
IMMEDIATELY if the requested resource is already in the local cache. And
by immediately, I mean: before the send() method has returned.

As long as you keep that in mind, it shouldn't cause any serious problems.

--
Joost Diepenmaat | blog: http://joost.zeekat.nl/ | work: http://zeekat.nl/
Oct 6 '08 #2
JT wrote:
This problem is sporadic, only happening on some peoples PCs some of
the time and not others (with the same full version as seen in
Help->About).
I don't know what you mean my "same full version" but mine says
6.0.2900.5512.xpsp.080413-2111

Since I received my PC a couple of years ago, Microsoft Update has
applied quite a few fixes affecting IE, and that version probably
doesn't identify exactly which combination I have.

Over this period, the behaviour of my IE6 has departed radically from
that of colleagues who don't run Microsoft/Windows update. The variation
is so great that two different IE6's, using the same CGI script, erase
different files when exactly the same button is clicked. (In later IE6,
only the button clicked gets submitted, so the correct file is deleted;
in earlier IE6, all of the delete buttons are submitted, so depending
how you wrote your CGI script, you either erase ALL possible files, or
the first, or the last. I was "lucky", and erased only the last, which
happened to be an extreme test case).

So don't expect all IE6's to behave the same, perhaps not even when
their version is the same.

--
Steve Swift
http://www.swiftys.org.uk/swifty.html
http://www.ringers.org.uk
Oct 6 '08 #3
JT wrote:
Asynchronous JavaScript
There is no such thing to begin with. All known ECMAScript implementations
are single-threaded. window.setTimeout()/setInterval(), which can emulate
threads to a certain extent, are host-defined features that are not part of
any current JavaScript version (1.4+) and have never been part of JScript.
I am building a Web App which relies heavily on asynchronous
javascript (XMLHttpRequest).

It works a beautifully in IE7 and FF 2+ , but in IE6 (6.0.2900.2180
((sp2)) even though the asynchronous flag is set to true the call is
synchronous and doesn’t fork!!
That is your *assumption*. Your code shows that your assumption is at fault
here, not necessarily IE/MSHTML.
req.onreadystatechange = function()
{
try
{
if(req)
{
CUtil.log("sendAsyncReq state : " + req.readyState);

if(req.readyState==1)
reqStage1OK = true;
else if(req.readyState==4)
{
if(req.status==200)
{
clearTimeout(to);
CUtil.log("HTTP 200 from sendAsyncReq, done.");
callback(req.responseText);
onExitRoot=true;
}
else
{
clearTimeout(to);
CUtil.log("HTTP/1.1 ERR from sendAsyncReq.");
try { CUi.displayMsg("Error",true); req.abort(); } catch(err) {}
onExitRoot=true;
}
}
}
} catch(e) { CUtil.log(e.message); alert("ERR: " + e.message); }
}

CUtil.log("About to send data request");
req.send(null);

if(onExitRoot && !callerHasLeft)
{
CUtil.log("Async not working!!");
//IF we get here async didn't work!!
//THis case is hit in IE6 on one call and then on a
subsiquent call it is not hit.
}
There is the root of your mistake. You are assuming that when onExitRoot ==
true the event listener must have exited. But the nature of asynchronous
(request-response) handling is that things happen (here: seemingly) in
parallel, and that req.send(null) does _not_ wait for the listener to be
called. So it is entirely possible that the assignment did take place when
you evaluate the property value.

Since you always set `callerHasLeft' to `false' before req.send(null)
always, the second operand of the AND operation is always true and so does
not matter.
PointedEasrs
--
realism: HTML 4.01 Strict
evangelism: XHTML 1.0 Strict
madness: XHTML 1.1 as application/xhtml+xml
-- Bjoern Hoehrmann
Oct 6 '08 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: William C. White | last post by:
Does anyone know of a way to use PHP /w Authorize.net AIM without using cURL? Our website is hosted on a shared drive and the webhost company doesn't installed additional software (such as cURL)...
2
by: Albert Ahtenberg | last post by:
Hello, I don't know if it is only me but I was sure that header("Location:url") redirects the browser instantly to URL, or at least stops the execution of the code. But appearantely it continues...
3
by: James | last post by:
Hi, I have a form with 2 fields. 'A' 'B' The user completes one of the fields and the form is submitted. On the results page I want to run a query, but this will change subject to which...
0
by: Ollivier Robert | last post by:
Hello, I'm trying to link PHP with Oracle 9.2.0/OCI8 with gcc 3.2.3 on a Solaris9 system. The link succeeds but everytime I try to run php, I get a SEGV from inside the libcnltsh.so library. ...
1
by: Richard Galli | last post by:
I want viewers to compare state laws on a single subject. Imagine a three-column table with a drop-down box on the top. A viewer selects a state from the list, and that state's text fills the...
4
by: Albert Ahtenberg | last post by:
Hello, I have two questions. 1. When the user presses the back button and returns to a form he filled the form is reseted. How do I leave there the values he inserted? 2. When the...
1
by: inderjit S Gabrie | last post by:
Hi all Here is the scenerio ...is it possibly to do this... i am getting valid course dates output on to a web which i have designed ....all is okay so far , look at the following web url ...
2
by: Jack | last post by:
Hi All, What is the PHP equivilent of Oracle bind variables in a SQL statement, e.g. select x from y where z=:parameter Which in asp/jsp would be followed by some statements to bind a value...
3
by: Sandwick | last post by:
I am trying to change the size of a drawing so they are all 3x3. the script below is what i was trying to use to cut it in half ... I get errors. I can display the normal picture but not the...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.