Right after my script is loaded I am making an Ajax request to get some translations. This should always return after the document is ready since I am loading my scripts at
Here's a cleaned up version of ircmaxell's comment:
(function() {
var doc_ready = $.Deferred();
$(doc_ready.resolve);
$.when(doc_ready, $.ajax('translations')).then(function() {
console.log("done");
});
})();
edit
Some clarification to stop the incorrect edits:
Passing a function to the jquery object (e.g. $(some_func)
) is the same as $(document).ready(some_func)
.
Therefore, the $(doc_ready.resolve);
line is just shorthand for something like this:
$(document).ready(function() {
doc_ready.resolve()
});
You can associate a deferred object with the document using data(), and resolve() it in your ready
handler. This way, you should be able to use the stored deferred object with $.when():
$(document).data("readyDeferred", $.Deferred()).ready(function() {
$(document).data("readyDeferred").resolve();
});
$.when($.ajax("translations"), $(document).data("readyDeferred"))
.then(function() {
// Start doing stuff here.
});
Update for reference (2015):
This is available in current versions of jQuery:
$.when($.ready).then(...);
It is also simple to convert to a stream using highlandjs:
_($.when($.ready)).map(transform).pipe(output) // etc.
My version is:
$.when(
$.Deferred(function() { $(this.resolve); }),
$.ajax('translations')).
then(function() { console.log("done"); });
jQuery's when
is not a proper promise. You can force it into one like this:
function documentReady() {
return Promise.resolve($.when($.ready));
}
Usage:
documentReady().then(function($) { ... });
It happens to resolve with $
so that's kind of convenient too.
Alternative implementation:
function documentReady() {
return new Promise(r => $(r));
}
Try this:
$.when($.ajax('translations'), $.ready).then(function() {
// Start doing stuff here
});