Custom builds: use different ready code when excluding Deferred #2891
Conversation
|
By analyzing the blame information on this pull request, we identified @markelog, @mgol and @mikesherov to be potential reviewers |
| @@ -5,12 +5,13 @@ define( [ | |||
| ], function( jQuery, document ) { | |||
|
|
|||
| // The deferred used on DOM ready | |||
| var readyList; | |||
| var readyList = jQuery.Deferred(), | |||
| readyPromise = readyList.promise(); | |||
gibson042
Feb 3, 2016
Member
I'm pretty sure you can get rid of readyPromise and just use readyList directly.
I'm pretty sure you can get rid of readyPromise and just use readyList directly.
|
|
||
| jQuery.fn.ready = function( fn ) { | ||
|
|
||
| // Add the callback | ||
| jQuery.ready.promise().done( fn ); | ||
| readyPromise.done( fn ); |
gibson042
Feb 3, 2016
Member
This .done is the source of #1823... if we're willing to give up a synchronicity guarantee, then it could become .then, the synchronous invocations could get wrapped in setTimeout (removing try...finally in the process), and those error resiliency tests could be restored.
What do you think? Is anyone counting on jQuery( invokedFirst ); invokedSecond()?
This .done is the source of #1823... if we're willing to give up a synchronicity guarantee, then it could become .then, the synchronous invocations could get wrapped in setTimeout (removing try...finally in the process), and those error resiliency tests could be restored.
What do you think? Is anyone counting on jQuery( invokedFirst ); invokedSecond()?
mgol
Feb 3, 2016
Member
I think it's much less likely to depend on that than to depend on synchronous then on a resolved promise and yet we made that change. Aligning those behaviors only seems good to me.
I think it's much less likely to depend on that than to depend on synchronous then on a resolved promise and yet we made that change. Aligning those behaviors only seems good to me.
timmywil
Feb 4, 2016
Author
Member
I actually tried switching to then, but didn't get the behavior I expected. I'll keep digging.
I actually tried switching to then, but didn't get the behavior I expected. I'll keep digging.
- Keeps it Promise-compatible Fixes gh-1778
| // Prevent errors from freezing future callback execution (gh-1823) | ||
| // Not backwards-compatible as this does not execute sync | ||
| window.setTimeout( function() { | ||
| fn.call( document, jQuery ); |
gibson042
Mar 28, 2016
Member
Do we want to keep the document context? It's another backwards-compatible but non-Promise "feature". And if we do keep it, there should be verifying assertions in test/unit/ready.js.
Do we want to keep the document context? It's another backwards-compatible but non-Promise "feature". And if we do keep it, there should be verifying assertions in test/unit/ready.js.
timmywil
Mar 28, 2016
Author
Member
Perhaps we can leave that subject to change/undocumented. I don't want to verify it if we're going to change it in a future version.
Perhaps we can leave that subject to change/undocumented. I don't want to verify it if we're going to change it in a future version.
gibson042
Mar 28, 2016
Member
I'm suggesting that we change it now, in both places.
I'm suggesting that we change it now, in both places.
timmywil
Mar 28, 2016
Author
Member
Let's open another ticket then. This PR is already 2 tickets. I'd rather not hold it up. But I'm indifferent as to what context we use here. document still makes sense since it's the document ready handler.
Let's open another ticket then. This PR is already 2 tickets. I'd rather not hold it up. But I'm indifferent as to what context we use here. document still makes sense since it's the document ready handler.
gibson042
Mar 29, 2016
Member
This PR is the introduction of jQuery.ready.then... why start off on the wrong foot when we don't have to? It doesn't even make sense to create a ticket referencing behavior that hasn't landed. But I guess I'll put some text here just in case:
Per Promises/A+ and ES2015, then callbacks should be called without a this context. And although jQuery.Deferred#*With methods provide context to callbacks, we are moving in the direction of increased standards compliance, and should stop providing document context to jQuery.ready callbacks while we're already making backwards-incompatible changes to jQuery.ready.
This PR is the introduction of jQuery.ready.then... why start off on the wrong foot when we don't have to? It doesn't even make sense to create a ticket referencing behavior that hasn't landed. But I guess I'll put some text here just in case:
Per Promises/A+ and ES2015,
thencallbacks should be called without athiscontext. And althoughjQuery.Deferred#*Withmethods provide context to callbacks, we are moving in the direction of increased standards compliance, and should stop providingdocumentcontext tojQuery.readycallbacks while we're already making backwards-incompatible changes tojQuery.ready.
dmethvin
Mar 29, 2016
Member
I'm fine with not passing document, we just need to document that and the fact that it's async now. I can do that in the release notes once this lands.
I'm fine with not passing document, we just need to document that and the fact that it's async now. I can do that in the release notes once this lands.
timmywil
Mar 29, 2016
Author
Member
@gibson042 The change wouldn't just affect jQuery.ready.then, and I'm familiar with the spec on Promises. Like you said, the document context is for back-compat, as we still have $(function(){}) and $(document).ready(), and while some may prefer Promise.resolve(jQuery.ready), I imagine that $(document).ready() and $(function() {}) will still be the most common, and a document context still makes sense to me on the latter 2. Like I said tho, I'm not opposed to changing that, but we don't have to change it now.
@gibson042 The change wouldn't just affect jQuery.ready.then, and I'm familiar with the spec on Promises. Like you said, the document context is for back-compat, as we still have $(function(){}) and $(document).ready(), and while some may prefer Promise.resolve(jQuery.ready), I imagine that $(document).ready() and $(function() {}) will still be the most common, and a document context still makes sense to me on the latter 2. Like I said tho, I'm not opposed to changing that, but we don't have to change it now.
jQuery.ready.promisehas been removed andjQuery.readymade a thenable in core/ready..thenin the.readymethod.