- From: Tab Atkins Jr. <jackalmage@gmail.com>
- Date: Fri, 26 Apr 2013 11:32:49 -0700
- To: Kevin Smith <zenparsing@gmail.com>
- Cc: David Sheets <kosmo.zb@gmail.com>, Brendan Eich <brendan@mozilla.com>, "Mark S. Miller" <erights@google.com>, Douglas Crockford <douglas@crockford.com>, "public-script-coord@w3.org" <public-script-coord@w3.org>, Norbert Lindenberg <w3@norbertlindenberg.com>, Markus Lanthaler <markus.lanthaler@gmx.net>, EcmaScript <es-discuss@mozilla.org>
On Fri, Apr 26, 2013 at 11:25 AM, Kevin Smith <zenparsing@gmail.com> wrote:
> Actually, I may have gotten it terribly wrong (apologies). In my prototype
> implementation, the following:
>
> Future.accept(Future.resolve(1)).then(value => {
>
> console.log(value !== 1);
> return Future.accept(Future.resolve(1));
>
> }).then(value => {
>
> console.log(value === 1);
> });
>
> logs
>
> - true
> - true
>
> Is that what it should be doing, according to the DOM spec? Anne, Alex?
No, it should be "true", then "false".
Future.resolve(1) returns a Future<1>.
Future.accept(Future.resolve(1)) returns Future<Future<1>>.
If you call .then() on a Future<Future<1>>, the callback receives a
Future<1> as its argument.
If you return a Future<Future<1>> from the callback, the chained
future adopts its state, which means that the chained future is now
also a Future<Future<1>>.
So, calling .then() on the chained future will give you the same
result - the callback receives a Future<1> as its argument.
(Using a mixture of Future.accept and Future.resolve in the way that
you have makes things more confusing than necessary. When called on a
plain value, the two functions are identical. They only act
differently when you call them on a future.)
~TJ
Received on Friday, 26 April 2013 18:33:36 UTC