- From: Domenic Denicola <domenic@domenicdenicola.com>
- Date: Fri, 26 Apr 2013 15:03:56 +0000
- To: David Sheets <kosmo.zb@gmail.com>
- CC: Juan Ignacio Dopazo <dopazo.juan@gmail.com>, "public-script-coord@w3.org" <public-script-coord@w3.org>, es-discuss <es-discuss@mozilla.org>
From: David Sheets [kosmo.zb@gmail.com]
> Why is there a semantic distinction between my thenables and your thenables?
Because your thenables are not to be trusted! They could do pathological things like jQuery, or conceptually incoherent things like thenables-for-thenables. Sanitation at the boundary is the idea behind the resolve algorithm.
> If someone is using nested thenables, presumably they have a good reason. Promises/A+ acknowledges this possibility by allowing own-promises to nest.
Yes, but more importantly, it preserves the guarantees within a single library---whether they be allowing promises-for-thenables, or disallowing them. Q, when, RSVP, and others guarantee no promises-for-thenables. That is a great feature for consumers of those libraries, as has been emphasized many times in this thread (especially elegantly, I think, by David Bruant). If there were no recursive foreign thenable assimilation, then promises-for-thenables could sneak into Q/when/RSVP promise systems, breaking the assumptions of consumers of those promises.
> If we are interesting in constructing the "most standard" promises system, surely this system must grant other, foreign systems the same possibility of nesting own-promises without interference?
No. Generally, foreign systems *must* be normalized, for security concerns if nothing else. Trying to accommodate foreign system semantics into your own promise system is a recipe for disaster. Mark can expand upon this more in detail, if you think it's an important point.
> Could you point me to some code that needs dynamic flattening?
>From https://github.com/promises-aplus/promises-spec/issues/101#issuecomment-16657518
> ```js
> var promise = getDataFromServerUsingQ().then(function (data) {
> return $('.foo').animate('opacity', data.opacityLevel).promise().then(function () {
> return updateBackboneModelViaSomeThirdPartyLibraryUsingUnderscoreDeferred().then(function () {
> return tellServerThatTheUpdateSucceededUsingQ();
> });
> });
> });
> ```
> If Q, as a proper Promises/A+ library, does recursive `[[Resolve]]`, this is a promise for undefined that will be rejected with the appropriate error if any of the operations failed. But if it did one-level unwrapping, this would be a QPFAUDPFAQPFU, and it would always fulfill---failure information would have to be manually extracted.
Hope that helps!
Received on Friday, 26 April 2013 15:04:29 UTC