I do believe it meant to say 'cheap words and unreality'.  Nothing to care
about.


On Tue, Feb 4, 2014 at 11:04 PM, Brendan Eich <[email protected]> wrote:

> [email protected] wrote:
>
>> >  The existing promises library users would be faced with a porting
>> problem
>> >  whose size is hard to estimate
>>
>> Naive go here;
>>
>> Promise.prototype.then= function(fn){
>>         function recurse(val){
>>                 if(val.chain)
>>                         val.chain(recurse)
>>                 else
>>                         fn(val)
>>         }
>>         return this.chain(recurse)
>> }
>>
>
> That's not how .then works in any existing library I know of. It's not how
> .then works in Promises/A+ (http://promises-aplus.github.io/promises-spec/).
> That is not going to interop with anything thenable. It introduces a new
> chainable (duck-typed, no function value test even, .chain truthy property).
>
> There is no point in showing a trivial but incompatible layering of .then
> on .chain. That's not the issue.
>
> Here is V8's .chain-based, self-hosted-in-V8's-JS-for-builtins-dialect,
> Promise.prototype.then implementation:
>
> function PromiseThen(onResolve, onReject) {
>   onResolve = IS_UNDEFINED(onResolve) ? PromiseIdResolveHandler :
> onResolve;
>   var that = this;
>   var constructor = this.constructor;
>   return this.chain(
>     function(x) {
>       x = PromiseCoerce(constructor, x);
>       return x === that ? onReject(MakeTypeError('promise_cyclic', [x])) :
>              IsPromise(x) ? x.then(onResolve, onReject) : onResolve(x);
>     },
>     onReject
>   );
> }
>
> Notice the recursion is not via .chain, rather (and only if IsPromise(x),
> a nominal type test) via .then.
>
>
>  I tend to believe there is for sure something real, and interesting under
>> #3: that there was a real issue in implementation that drove ES6 at the
>> very last hour away from .chain serving as the basis for .then. If you want
>> something other than cheap words an unreality,
>>
>
> (I have no idea what "cheap words an unreality" means here. Should I care?)
>
>
>  perhaps you'd color in some of those details.
>>
>
> It's pretty simple. Adding .chain in addition to library-compatible .then
> means Promise.resolve must always make a new promise, even for a promise
> argument. Otherwise you can't compose resolve and chain to wrap once always
> and unwrap once only, respectively.
>
> Drop .chain, use only .then, and resolve can cast instead of wrap, which
> some promises libraries that lack chain indeed do today (an optimization,
> #3 in your cited text, my point (3)).
>
> Having the two APIs together require what V8's self-hosted,
> .chain-extended implementation does: always wrapping the argument x to
> Promise.resolve in a new Promise. That's the problem I numbered (3). Clear?
>
> /be
>
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss
>
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to