Not sure if this is correct, but: This might actually be (perhaps
accidentally) one step closer to allowing promises for thenables in a
cleaner way *if* the need arises in the future.

Since its impossible to create a promise for a promise now, it would be
*theoretically* possible (at some point in the future) to just

* introduce `Promise.of` (wraps thenables)
* make `.then` unwrap "true" promises only once
* make `resolve` cast thenables into promises that recursively unwrap
thenables

and be done. You'd have

* `Promise.of` - wraps thenables, returns promises, wraps other values
* `resolve` - converts thenables to recursively unwrapping promises,
returns promises, wraps other values
* `.then(f, r)` - for values returned by the handlers: recursively unwraps
thenables, unwraps promises once, wraps other values


After that, you could use `.then` in a monadic way, provided you remember
to protect thenables with `Promise.of` (should not be a problem with typed
compile-to-js languages). e.g. `resolve(Promise.of(thenable))` or `p.then(x
=> Promise.of(thenable))`  You could also implement `.map` using `.then`
and `Promise.of`

Previously you'd have to make `resolve` and `Promise.cast` the same before
making `.then` unwrap a single level. Alternatively, you'd have to
introduce `.chain` and have a confusing dual API (chain/then,
resolve/cast).



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

> Tab Atkins Jr. wrote:
>
>> On Tue, Feb 4, 2014 at 10:55 AM, Rick Waldron<[email protected]>
>>  wrote:
>>
>>> >  Per Resolution
>>> >  (https://github.com/rwaldron/tc39-notes/blob/master/es6/
>>> 2014-01/jan-30.md#conclusionresolution-3)
>>> >
>>> >  - Promise.cast is renamed to Promise.resolve (remove old
>>> Promise.resolve)
>>> >  - Keep then, reject chain (NOT DEFER, reject!)
>>> >  - Renaming .cast thus removes over-wrapping (always-wrap)
>>> deoptimization in
>>> >  old Promise.resolve
>>>
>>
>> Okay, so this is discarding the previous consensus, right?  Monadic
>> promises are thrown out?
>>
>
> Fundamental conflict between .chain and .then, on three levels:
>
> 1. Committee "do both" / union proposals smell and bloat -- this is a
> problem _per se_.
>
> 2. All the standard combinators call .then not .chain.
>
> 3. Including .chain requires always-wrapping resolve, observability trumps
> optimizability.
>
> There's really a 0 implicit in this:
>
> 0. Monadic vs. non-monadic is an exclusive or -- you can't "have it all".
>
>  This breaks async maps forever, then. :/  With the previous consensus,
>> the result promise from an async map could be observed directly with
>> .chain(), and it worked great regardless of what was stored inside the
>> map.
>>
>> With only flat promises, if you store a promise in an async map and
>> then try to retrieve it later, the error callback gets called if the
>> key wasn't in the map*or*  the key was in the map, but the stored
>>
>> value was a rejected promise.  You have to spread your program logic
>> over both callbacks to catch that case (or more likely, people will
>> just write programs that break occasionally because they assumed that
>> the reject branch of the AM.get() promise is only for failed lookups,
>> as the documentation probably says).
>>
>
> This does seem like a problem in the async map API, but I bet it can be
> solved without taking the hit of 1-3 above. Overloading get's return value
> is the root of the evil. Hand-boxing disambiguates the r.v.
>
>  Similarly, if you store a forever-pending promise in the async map,
>> it's impossible to ever retrieve it.  Even just a long-pending promise
>> will stall your program's logic while it waits, preventing you from
>> updating UI when the map returns and*then*  completing the operation
>>
>> when the stored promise finally resolves.
>>
>
> This, I don't buy. You have to hand-box using {value: } or whatever.
>
>
>  The only way to get a working async map is to defensively store your
>> values in a single-element array (or some other non-promise wrapper
>> object) and unwrap them on retrieval.
>>
>
> Right, hand-box. That's the price of the XOR between Monadic and
> anti-Monadic promises, and anti-monadic already won in the library
> evolution of Promises.
>
>
>  Pretending that all promises are identical identity-less wrappers that
>> can be arbitrarily collapsed is such a mistake.>_<
>>
>
> There are no great paths forward. I would like to make promises value
> objects, E-like. But it's too late. Promises happened, the DOM and ES6 need
> them, worse is better. You knew that already!
>
> /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