I just read through this thread, and found it really interesting. Figured I
would chime in with my opinions, for whatever that's worth.
Firstly, let me explain I run a project called flXHR (http://flxhr.flensed.com)
which is an XHR clone variant with cross-domain Ajax capability (using
invisible flash). It implements an identical API to the regular XHR object, so
it can be dropped in as a replacement and should behave quite similarly.
So, my interest in this discussion is that I of course want to keep flXHR API
compatible (as much as possible) with regular XHR implementations in the
browsers.
1. With respect to "responseJSON", I think this is a good idea. However, I
would just say that I think there's some inefficiency when a single response is
translated into binary (IE), XML, JSON, text, etc. Very rarely will a single
response be applicable to all those formats. So either the conversion fails for
the non-applicable formats, or at least there's some processing time spent
needlessly trying to convert to XML when it's not well formed XML in the first
place, for instance.
Perhaps the implementations already take care of this by first validating if a
block of text can in fact be converted to that type. But again, even this check
must take some processing time.
The other thing to consider is how these properties are represented during
readyState=3. Text based representation (and even binary) is probably not an
issue, but I'm sure that there's got to be some sort of special processing to
represent the "responseXML" as a well formed (auto-node-completed?) XMLdocument
when it's only partially downloaded. The same issue would apply to creating a
partial JSON object. And I'm not sure how "expensive" such logic is.
Just thinking maybe to avoid some of that, these "properties" could be
on-demand in some way, so that the object doesn't try to do the conversion
until it's requested... requires them to be implemented as accessors rather
than actual properties, but maybe it would help? Just something to consider.
2. With respect to "ontimeout" event. I implemented this in flXHR (seeing that
IE8 was going to support it), but it looks like I inadvertently took a slightly
different take on it (since IE8 was still in early beta when I did flXHR
originally). In my opinion, the timeout event is more appropriately applicable
in the period of time before any response has been returned (between state 2
and 3/4). Once some response has come back (all or partial), it seems like the
timeout is less important/applicable. Maybe this is just opinion and may differ
with a lot of different people.
But if "ontimeout" were defined to only fire if the timeout happens before any
part of the response comes back, all the questions raised about what to do with
the partially filled properties (empty them, reset, abort, etc) would be moot.
That's how my "ontimeout" works. But now that I realize it diverges from IE8's
implementation, I may need to revisit it, unless you agree that it's a simpler,
better way to approach the timeouts. Certainly, I will follow this discussion
more closely to see the outcomes.
Thanks for your time and consideration on my opinions.
--Kyle Simpson