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 m...@isiahmeadows.com www.isiahmeadows.com _______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss