You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
In a testing framework that we use, Promise.resolve is intercepted (among others) to implement some bookkeeping for pending promises, timers, requests etc. The intercepting code looks something like this:
(function(){constoriginalResolve=Promise.resolve;// *1*Promise.resolve=function(value){// propagate the current call to the original function, // using the same context and argumentletresult=originalResolve.call(this,value);// *2*// bookkeeping is implemented around the original call, doesn't matter herereturnresult;};}();
Recently, we tried to upgrade es6-promise from 2.3.0 to 4.2.4 to benefit from Promise.prototype.finally. But then, the above intercepting code failed with a
TypeError: Constructor is not a constructor
at resolve$1 (es6-promise.js:231:17)
The reason seems to be that es6-promise's current Promise.resolve implementation relies on this (to allow inheritance), but the Enumerator.prototype._eachEntry implementation ignores this fact here in combination with line 82.
To cite from #286 (IMO applies to resolve as well):
If you wish to destructure all, it can be, but must be first bound.
Well, I understand that this applies to our test framework (line *1*) and binding originalResolve would fix the issue. But I think, the strategy of calling the originalResolve with the current this and argument (line *2*) is also fine and a bit more universal. It even should work if someone would re-use the wrapped Promise.resolve in a subclass of Promise.
IMO it would be fair if Enumerator.prototype._eachEntry either would follow the "if you wish to destructure ... it first must be bound" rule itself or would call Constructor.resolve in line 82.
What do you think?
The text was updated successfully, but these errors were encountered:
In a testing framework that we use,
Promise.resolve
is intercepted (among others) to implement some bookkeeping for pending promises, timers, requests etc. The intercepting code looks something like this:Recently, we tried to upgrade es6-promise from 2.3.0 to 4.2.4 to benefit from
Promise.prototype.finally
. But then, the above intercepting code failed with aThe reason seems to be that es6-promise's current
Promise.resolve
implementation relies onthis
(to allow inheritance), but theEnumerator.prototype._eachEntry
implementation ignores this fact here in combination with line 82.To cite from #286 (IMO applies to resolve as well):
Well, I understand that this applies to our test framework (line *1*) and binding
originalResolve
would fix the issue. But I think, the strategy of calling theoriginalResolve
with the currentthis
and argument (line *2*) is also fine and a bit more universal. It even should work if someone would re-use the wrappedPromise.resolve
in a subclass ofPromise
.IMO it would be fair if
Enumerator.prototype._eachEntry
either would follow the "if you wish to destructure ... it first must be bound" rule itself or would callConstructor.resolve
in line 82.What do you think?
The text was updated successfully, but these errors were encountered: