Comments (5)
The guards in checkCapability (lines 217-221)
The reason for those checks is... well... quite complicated.
If you want to dive deep down the rabbit hole, check out these threads:
- domenic/promises-unwrapping#107
- domenic/promises-unwrapping#24 (really really long!)
As for how to devise a test that covers them, see that checkCapability
is called from Promise.resolve(..)
Promise.reject(..)
Promise.all(..)
Promise.race(..)
-- and then they each call a Constructor
that comes the this
binding to construct a promise to use. This is mandated by the spec.
If you did Promise.resolve.call( someOtherPromiseConstructor, ... )
, that would substitute in a different this
, thus a different Constructor
, and you'd have to assume you couldn't trust the resolve
and reject
capabilities that the other Constructor
provides. The discussion threads above (especially the first one) explain why we have to treat the failed capabilities as a sync thrown error rather than deferring that check until "later" at the call-site.
To test, we could do something like:
function someOtherPromiseConstructor(executor) {
executor( "foo", "bar" );
}
try {
Promise.resolve.call( someOtherPromiseConstructor, 42 );
Promise.reject.call( someOtherPromiseConstructor, 42);
Promise.all.call( someOtherPromiseConstructor, [ Promise.resolve(42) ] );
Promise.all.race( someOtherPromiseConstructor, [ Promise.resolve(42) ] );
}
catch (err) { .. }
Make sense?
There's one other code path that checkCapability(..)
is called on: line 254.
then(..)
produces its own promise for promise-chaining. Technically, the spec implies (doesn't state explicitly but doesn't disallow) you should be able to do this (though almost the only reason for such craziness is sub-classing, which is dubious as stated in other threads):
var p = new Promise(..);
var aDifferentP = p.then.call( someOtherPromiseConstructor, .. );
My implementation doesn't support that currently, because before doing some perf optimizations, it was impossible -- now it's possible but not supported. So I could for consistency sake go back and change line 253 to new this.constructor(..)
instead of new Promise(..)
.
It would enable such a test for then(..)
this-borrowing to pass, but again I'm dubious (especially given the "inherited" .constructor
junk), because there's almost no justifiable case for that kind of thing except for sub-classing. Shrugs.
I'll probably make a little patch nonetheless, even though I think it's a silly and mostly moot feature.
from native-promise-only.
[Update]: In the process above of changing to new this.constructor(..)
, found another bug where all along I've been setting Promise.prototype
incorrectly. So, yay for finding and fixing bugs!
from native-promise-only.
The test for the then(..)
this-borrowing and checkCapability should be something like:
try {
Promise.resolve(42).then.call( someOtherPromiseConstructor );
}
catch (err) { .. }
from native-promise-only.
Forgot that this
-borrowing also needs to work for the catch(..)
method. Fixed that. The test would be:
try {
Promise.reject(42).catch.call( someOtherPromiseConstructor );
}
catch (err) { .. }
from native-promise-only.
closing for now because I believe these issues have all been addressed. re-open if not.
from native-promise-only.
Related Issues (20)
- browsers support information HOT 7
- Cross-Browser Support & Tests HOT 3
- Support IE8 HOT 5
- What is correct execution sequence when attach multiple handlers to the same promise. HOT 8
- Better native support detection? HOT 3
- Create tag for v0.7.6-a HOT 1
- Android 4.0 issue HOT 17
- AMD? HOT 19
- handling uncaught exceptions HOT 5
- Promise.resolve(1) throws on Android 4.0 HOT 1
- `resolve(..)` should call a thenable's `then(..)` async, not sync. HOT 5
- Unhandled rejection detection HOT 9
- Suggestion: make Promise.prototype aliases of `then` and `catch` HOT 5
- Error when running through babel compiler HOT 5
- Module with unminified code should be exported by default
- on nodejs, exceptions are not shown. HOT 4
- Microtasks? HOT 1
- Ponyfill support? HOT 1
- Missing tag for version 0.7.8-a used by jQuery HOT 7
- Promise finally not supported HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from native-promise-only.