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: Tab Atkins Jr. <jackalmage@gmail.com>
Date: Thu, 2 May 2013 14:42:31 -0700
Message-ID: <CAAWBYDChiC37hjh5jDyae5qTKTRcydm+70_+FKk9WL-Zpb9hBg@mail.gmail.com>
To: "Sam L'ecuyer" <sam@cateches.is>
Cc: Domenic Denicola <domenic@domenicdenicola.com>, "public-script-coord@w3.org" <public-script-coord@w3.org>
On Thu, May 2, 2013 at 2:32 PM, Sam L'ecuyer <sam@cateches.is> wrote:
>> What I'm hoping for is an explanation of why assimilating thenables is
>> necessary in the .then() callbacks, and why my concerns about
>> predictability (such as returning an object which has a .then()
>> method, but is not a promise-like, which "assimilates" with
>> non-sensical behavior and possibly causes errors) are either unfounded
>> or less important than the benefits of auto-assimilation.
>
> I think auto-assimilation is more accurately "auto-assuming".
> The issue you're trying to overcome is that we attempt to unwrap the return value from a callback if it seems promise-like.
>
> doStuff().then(function(x) {
>   return 5;
> }).then(function(y) {
>   //y is 5
> });
>
> doStuff().then(function(x) {
>   return Future.accept(5);
> }).then(function(y) {
>   //y is 5
> });
>
> doStuff().then(function(x) {
>   return {then: function(){ return "uh-oh"}};
> }).then(function(y) {
>   // the unwrap assuredly failed
> });
>
>
> What you want is:
>
> doStuff().then(function(x) {
>   return Future.assimilate({then: function(){ return "uh-oh"}});
> }).then(function(y) {
>   // y is {then: function(){ return "uh-oh"}}
> });
>
> Correct me if any of that's wrong.  Seems reasonable to me.

Almost.  The reason the third example failed is because it's a
"thenable" but not a "promise-like" - it's a false positive for the
"should I treat this like a promise?" test.

Your fourth example is an inversion of what I'm trying to say.  I want
promises to work such that:

1. A "thenable" is just treated as a plain value when returned by a
.then() callback.
2. You use Future.assimilate() or whatever to transform a
"promise-like" into a promise.

~TJ
Received on Thursday, 2 May 2013 21:43:18 UTC

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