W3C home > Mailing lists > Public > public-script-coord@w3.org > April to June 2013

Re: Promises: Auto-assimilating thenables returned by .then() callbacks: yay/nay?

From: Alex Russell <slightlyoff@google.com>
Date: Fri, 3 May 2013 12:05:32 +0100
Message-ID: <CANr5HFUZO4PWg8YSamY3XhyLyHT8Ps_=YxAkCCZw2TrVL3r6xw@mail.gmail.com>
To: Tab Atkins <jackalmage@gmail.com>
Cc: public-script-coord@w3.org
I strongly disagree with this direction.
On May 2, 2013 7:37 PM, "Tab Atkins Jr." <jackalmage@gmail.com> wrote:

> Now that DOM Futures have moved to accept semantics ("monad
> semantics") when a .then() callback returns a Future, there's only one
> remaining issue that I want to try and get agreement over.
>
> I am explicitly asking for feedback from Domenic and others who have
> experience in the Promises/A+ standardization effort.  More
> echo-chamber from us in the "monad camp" won't be particularly
> helpful. ^_^
>
> The last issue is automatic assimilation of thenables return by
> .then() callbacks.  To be clear, by "thenable" I mean "any object with
> a .then() method, which is not a native/branded promise".
>
> I believe that thenables returned by a .then() callback should be
> treated as "plain values", and we should add an explicit assimilation
> function that does the job of converting a thenable into a native
> promise.
>
> My reasoning is that this is necessary for predictability.  "Thenable"
> is a structural type - it applies to everything with a .then() method,
> regardless of whether it was *intended* to be a promise-like or not.
> We already have at least one explicit example of a library returning
> objects with a .then() method that aren't promise-like: the Casper.js
> library.  I'm sure there are more, and will be more as long as we
> don't mess this up.
>
> If we auto-assimilate, it means that anytime we want to return the
> value of some function, if we're not sure that the return value is a
> primitive or a native promise, we have to use Future.accept() to guard
> it against the possibility of accidental and erroneous assimilation.
> (Wrapping the value in an accepted promise triggers the monad
> semantics, which are safe regardless of what the inner value is.)
>
> So, I propose that we instead expose an explicit assimilation function
> that takes a promise-like and returns a native promise.  .then()
> callbacks then have a simple two-case semantics, which only check to
> see if the return value is a native/branded promise, and otherwise
> treat it as a plain value.  This makes promise semantics predictable
> and simple, at the minor cost that when crossing library boundaries,
> you have to manually assimilate.
>
> (I think this is acceptable, as we already do it in other places.  For
> example, jQuery objects are basically DOM Element-likes, but the DOM
> methods don't try and use them automatically.  Instead, jQuery lets
> you get at the native Element backing them, for when you need to step
> back into DOM land.  This would be similar.)
>
> ~TJ
>
>
Received on Friday, 3 May 2013 11:05:59 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 21:37:49 UTC