Brian Birtles <[email protected]> писал(а) в своём письме Tue, 10 Feb
2015 06:55:32 +0600:
player.pause(); // => let's assume that player is immediately ready,
// so pending pause task is not scheduled, all necessary actions are
immediately executed
Why is the player immediately ready? Are you assuming the player is
already paused?
If so, I think we should abort the procedure early in that case. As far
as I can tell, the procedure doesn't currently do that but it probably
should. I'll add an issue for that.
The procedure to pause a player reads (
http://w3c.github.io/web-animations/#pause-a-player ):
...
6. Schedule a task to be executed at the first possible momentafter the
user agent has performed any processing necessaryto suspend the playback
of player’s source content, if any.The task shall perform the following
steps:
...
I think, that meaning "Schedule a task" also allows to execute the task
immediately.
I assume that some implementations might be ready to execute the task
immediately,
because processing necessary to suspend the playback is not required or
can be competed immediately.
// player.ready promise is fulfilled
player.ready.then(function() { // => because player.ready promise is
fulfilled,
// the function is executed immediately, 'paused' is displayed.
alert(player.playState);
});
player.play();
// executes 'play a player' procedure
// http://w3c.github.io/web-animations/#playing-a-player-section
// there is no pending task
// player.ready promise is replaced with new one, which has no handler
In this case, the function associated with the ready promise is not run
immediately. Rather, it queues a microtask:
"A promise p is fulfilled if p.then(f, r) will immediately enqueue a
Job to call the function f."[1]
As a result, the subsequent call to player.play() will happen *before*
the callback is run.
Unfortunately, I am not so good with the Promises spec.
But isn't possible for promise to execute the function immediately,
instead of scheduling a microtask?
2. Methods play(), pause(), reverse() can replace AnimationPlayer.ready
with a new Promise object. There is no way to predict whether
AnimationPlayer.ready will be replaced or not, because it depends on
whether the player has pending tasks or not.
You can tell if it will be replaced by checking if playState is
'pending'. If playState is pending we will re-use the same Promise
object.
For example, how to get some function called in response to some method
call (pause() or play() or reverse())? I.e. I call, for example, method
pause() and would like to get my handlePause() function called exactly
when player pause operation is complete.
What if that pause never completes because there is a call to play() in
the meantime?
I am sorry, my statement is inexact.
I would like to get my handlePause() function called when player
completes "any processing necessary to suspend the playback
of player’s source content, if any." I.e. it should be called
at the same moment the player.ready.then() would call it without
any subsequent play(), reverse(), etc calls.
Is it possible to change the specification, that each method
(play, pause, reverse, finish) return unique Promise object related
to the method. So the following promise-like code could be possible:
player.pause().then(handlePause, rejected);
player.play().then(handlePlay, rejected);
player.finish().then(handleFinish, rejected);
I prefer this but the main problem is just the naming of play(). What do
you think of using resume()?
resume() is a counterpart of pause().
But resume() does not look well for beginning of the playback.
I think start() as a counterpart to finish() would be better.
And I like the idea that play().then( ... ) would execute after the
animation had finished.
Thanks,
Aleksei.