25

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

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

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

6 回答 6

24

您可以使用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.
});
于 2011-05-30T14:26:20.953 回答
20

这是 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()
});
于 2012-04-26T02:23:07.007 回答
9

尝试这个:

$.when($.ajax('translations'), $.ready).then(function() {
    // Start doing stuff here
});
于 2013-06-11T13:23:53.390 回答
6

我的版本是:

$.when(
  $.Deferred(function() { $(this.resolve); }), 
  $.ajax('translations')).
  then(function() { console.log("done"); });
于 2013-02-19T09:57:49.377 回答
2

更新参考(2015):

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

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

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

_($.when($.ready)).map(transform).pipe(output) // etc.
于 2015-12-19T18:35:57.840 回答
0

jQuerywhen不是一个正确的承诺。您可以将其强制为这样的:

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

用法:

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

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

替代实现:

function documentReady() {
    return new Promise(r => $(r));
}
于 2016-05-12T16:29:24.153 回答