Here's a quick overview of the "revealing constructor" pattern, if it helps: https://blog.domenic.me/the-revealing-constructor-pattern/ -----
Isiah Meadows [email protected] www.isiahmeadows.com On Wed, Jul 25, 2018 at 7:05 AM, Herbert Vojčík <[email protected]> wrote: > > > 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 >> [email protected] >> www.isiahmeadows.com >> _______________________________________________ >> 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

