【问题标题】:Can I get a jQuery Deferred on document.ready()?我可以在 document.ready() 上获得 jQuery Deferred 吗?
【发布时间】:2011-09-04 20:27:42
【问题描述】:

在我的脚本加载后,我正在发出 Ajax 请求以获取一些翻译。这应该总是在文档准备好后返回,因为我在页面底部加载我的脚本,但我仍然很好奇是否有可能在文档准备状态下获得 Deferred Object

这样就可以确保文档准备就绪并且 Ajax 调用在执行其他任何操作之前成功返回,例如像这样:

$.when( $.ajax('translations'), document.ready())
.then(function(){
    // Start doing stuff here
});

【问题讨论】:

    标签: jquery ajax jquery-deferred


    【解决方案1】:

    您可以使用data()resolve() 在您的ready 处理程序中将延迟对象与文档相关联。这样,您应该可以将存储的延迟对象与$.when() 一起使用:

    $(document).data("readyDeferred", $.Deferred()).ready(function() {
        $(document).data("readyDeferred").resolve();
    });
    
    $.when($.ajax("translations"), $(document).data("readyDeferred"))
     .then(function() {
        // Start doing stuff here.
    });
    

    【讨论】:

    • 谢谢,简单明了。这可能也适用于全局变量或类似的东西。
    • @Daff,绝对的。我个人更喜欢使用data() 而不是全局变量,因为它更灵活并且避免污染全局命名空间。
    • 迂腐注解。根本没有理由存储变量。你只需要在设置阶段,所以使用闭包作用域:(function() { var deferred = new $.Deferred(); $(function() { deferred.resolve(); }); $.when($.ajax('foo'), deferred).then(function() {}); })();...
    【解决方案2】:

    这是 ircmaxell 评论的清理版本:

    (function() {
      var doc_ready = $.Deferred();
      $(doc_ready.resolve);
      $.when(doc_ready, $.ajax('translations')).then(function() {
        console.log("done");
      });
    })();
    

    编辑

    一些澄清以停止不正确的编辑:

    将函数传递给 jquery 对象(例如 $(some_func))与 $(document).ready(some_func) 相同。

    因此,$(doc_ready.resolve); 行只是这样的简写:

    $(document).ready(function() {
      doc_ready.resolve()
    });
    

    【讨论】:

      【解决方案3】:

      我的版本是:

      $.when(
        $.Deferred(function() { $(this.resolve); }), 
        $.ajax('translations')).
        then(function() { console.log("done"); });
      

      【讨论】:

      • 我喜欢 deferred 的包含方式。一个建议是更改延迟的顺序,以便回调函数的第一个参数可以是为 $.ajax 延迟解析的任何值。
      【解决方案4】:

      试试这个:

      $.when($.ajax('translations'), $.ready).then(function() {
          // Start doing stuff here
      });
      

      【讨论】:

      【解决方案5】:

      参考更新(2015 年):

      这在当前版本的 jQuery 中可用:

      $.when($.ready).then(...);
      

      使用highlandjs转换成流也很简单:

      _($.when($.ready)).map(transform).pipe(output) // etc.
      

      【讨论】:

      • 正如前面提到的,它没有记录 $.ready 是一个延迟的对象。这在 2016 年仍然没有记录。
      • 在这个链接中有一些东西:api.jquery.com/jQuery.ready/#jQuery-ready1
      • 是的,这已于 2017 年 3 月添加到文档中
      【解决方案6】:

      jQuery 的when 不是一个正确的承诺。你可以像这样强制它:

      function documentReady() {
          return Promise.resolve($.when($.ready));
      }
      

      用法:

      documentReady().then(function($) { ... });
      

      它恰好可以用$ 解决,所以这也很方便。

      替代实现:

      function documentReady() {
          return new Promise(r => $(r));
      }
      

      【讨论】:

        猜你喜欢
        • 2017-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2014-02-13
        • 1970-01-01
        相关资源
        最近更新 更多