Promise capability support

Herbert Vojčík herby at mailbox.sk
Wed Jul 25 11:05:45 UTC 2018



Isiah Meadows wrote on 20. 7. 2018 3:13:
> Sometimes, it's *very* convenient to have those `resolve`/`reject`
> functions as separate functions. However, when logic gets complex
> enough and you need to send them elsewhere, save a continuation, etc.,
> it'd be much more convenient to just have a capability object exposed
> more directly rather than go through the overhead and boilerplate of
> going through the constructor with all its callback stuff and
> everything.
> 
> It's surprisingly not as uncommon as you'd expect for me to do this:
> 
> ```js
> let resolve, reject
> let promise = new Promise((res, rej) => {
>      resolve = res
>      reject = rej
> })
> ```
> 
> But doing this repeatedly gets *old*, especially when you've had to
> write it several dozen times already. And it comes up frequently when
> you're writing lower-level async utilities that require saving promise
> state and resolving it in a way that's decoupled from the promise
> itself.
> 
> -----
> 
> So here's what I propose:
> 
> - `Promise.newCapability()` - This basically returns the result of
> [this][1], just wrapped in a suitable object whose prototype is
> %PromiseCapabilityPrototype% (internal, no direct constructor). It's
> subclass-safe, so you can do it with subclasses as appropriate, too.
> - `capability.resolve(value)` - This invokes the implicit resolver
> created for it, spec'd as [[Resolve]].
> - `capability.reject(value)` - This invokes the implicit rejector
> created for it, spec'd as [[Reject]].
> - `capability.promise` - This returns the newly created promise.
> 
> Yes, this is effectively a deferred API, but revealing constructors
> are a bit too rigid and wasteful for some use cases.

Don't understand "revealing constructors". Can be done is userland in a 
few lines. https://lolg.it/herby/deferred-lite

> [1]: https://tc39.github.io/ecma262/#sec-newpromisecapability
> 
> -----
> 
> Isiah Meadows
> me at isiahmeadows.com
> www.isiahmeadows.com
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
> 


More information about the es-discuss mailing list