- From: Ian Hickson <ian@hixie.ch>
- Date: Mon, 9 Feb 2009 20:42:31 +0000 (UTC)
- To: Anne van Kesteren <annevk@opera.com>
- Cc: www-archive@w3.org
On Mon, 9 Feb 2009, Anne van Kesteren wrote:
>
> I still haven't quite figured out how to do event loops for
> XMLHttpRequest. Would it make sense to just emulate the media elements
> and have two task sources here? One for the network stuff and one for
> the events?
Are the events triggered by things occuring on the network? If so, use the
networking task queue for them.
> Is it so that in case of the synchronous request you do not queue a task to do
> a request and for the asynchronous request you would?
Yes.
> Currently Gecko does trigger timeouts and several events during a
> synchronous request, how is that represented in the event model? (I'm
> not really sure whether we want to follow that model, but I'm just
> wondering if it works.)
If you want the event loop to be pumped while in a synchronous method
call, just have your algorithm run the event loop manually, e.g. add these
steps in your algorithm (the numbers below are arbitrary):
...
13. If the data is not yet available [or whatever condition you are
waiting for] then run the oldest task on one of the event loop's
task queues, ignoring tasks whose associated Documents are not
fully active. The user agent may pick any task queue. [Or, list the
task queues that should or should not be consisdered.]
14. If a task was executed in the previous step, remove it from its
task queue.
15. If the data is not yet available [or whatever condition you are
waiting for] then return to step 13.
...
You would skip what is step 3 in the normal event loop algorithm,
probably.
Basically the event loop model makes everything "synchronous", in that
everything is executed at a given time. The browser just goes around the
altogrithm for the event loop, and runs the tasks that are queued. While a
task is running, you know no other script is running. Such a task might be
something like running a script or parsing. (Rendering actually happens as
part of the event loop, not as a separate task.)
When a method is invoked, you know you are running a task for that script.
If you want to run things synchronously, you just do them, since you know
that the scripts are waiting on you. If you want to do things async, you
add them to a task queue which is then run later when the event loop gets
to that task.
You can manually pump the event loop (as described above) when you want
tasks to be run even though the event loop isn't running (because it is
already dispatching a task).
HTH,
--
Ian Hickson U+1047E )\._.,--....,'``. fL
http://ln.hixie.ch/ U+263A /, _.. \ _\ ;`._ ,.
Things that are impossible just take longer. `._.-(,_..'--(,_..'`-.;.'
Received on Monday, 9 February 2009 20:43:06 UTC