Can I get a jQuery Deferred on document.ready()?

后端 未结 6 1395
失恋的感觉
失恋的感觉 2020-12-14 07:47

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

相关标签:
6条回答
  • 2020-12-14 08:28

    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()
    });
    
    0 讨论(0)
  • 2020-12-14 08:33

    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.
    });
    
    0 讨论(0)
  • 2020-12-14 08:33

    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.
    
    0 讨论(0)
  • 2020-12-14 08:35

    My version is:

    $.when(
      $.Deferred(function() { $(this.resolve); }), 
      $.ajax('translations')).
      then(function() { console.log("done"); });
    
    0 讨论(0)
  • 2020-12-14 08:37

    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));
    }
    
    0 讨论(0)
  • 2020-12-14 08:48

    Try this:

    $.when($.ajax('translations'), $.ready).then(function() {
        // Start doing stuff here
    });
    
    0 讨论(0)
提交回复
热议问题