This is related to #51 and proposes a different fix for it than was recently implemented in e2391248b0bd2c485b9f95c56c96dc5b8d0cf5e4.
Proposal
Remove the IsPromise check from GetDeferred
Either:
Fix Then/Promise.prototype.then to use a different mechanism, instead of GetDeferred, for constructing its return value. (easy)
Pass the deferred.[[Resolve]] and deferred.[[Reject]] functions through the algorithms so that they can be used to resolve/reject the return value. (hard)
I am not sure what the differences would be.
Observable Differences
This will allow non-subclass constructors to be used as the this of static promise methods.
In particular, the following will work:
// Will now return a RSVP.Promise instance.
Promise.all.call(RSVP.Promise, [...args]);
// The polyfilling use case:
RSVP.Promise.all = Promise.all || (iterable) => { ... };
This will not impact Promise.prototype.then, e.g. the following will not work:
// DOES NOT WORK
Promise.prototype.then.call(rsvpPromiseInstance, f, r);
RSVP.Promise.prototype.then = Promise.prototype.then || (f, r) => { ... };
The IsPromise check inside Then/Promise.prototype.then will stay, since the whole point of that algorithm is to send internal state out via the onFulfilled and onRejected arguments.
This is related to #51 and proposes a different fix for it than was recently implemented in e2391248b0bd2c485b9f95c56c96dc5b8d0cf5e4.
Proposal
Promise.prototype.then
to use a different mechanism, instead of GetDeferred, for constructing its return value. (easy)Observable Differences
this
of static promise methods.In particular, the following will work:
This will not impact
Promise.prototype.then
, e.g. the following will not work:The IsPromise check inside Then/Promise.prototype.then will stay, since the whole point of that algorithm is to send internal state out via the
onFulfilled
andonRejected
arguments.