我的脚本加载后,我正在发出Ajax请求以获得一些翻译。这应该始终在文档准备好后返回,因为我在页面底部加载脚本,但我仍然很好奇是否可以在文档就绪状态下获得Deferred Object。
这样就可以确保文档准备就绪并且Ajax调用在执行任何其他操作之前成功返回,例如像这样:
$.when( $.ajax('translations'), document.ready())
.then(function(){
// Start doing stuff here
});
答案 0 :(得分:23)
您可以使用data()将延迟对象与文档相关联,并在ready
处理程序中将resolve()与之关联。这样,您应该能够将存储的延迟对象与$.when():
$(document).data("readyDeferred", $.Deferred()).ready(function() {
$(document).data("readyDeferred").resolve();
});
$.when($.ajax("translations"), $(document).data("readyDeferred"))
.then(function() {
// Start doing stuff here.
});
答案 1 :(得分:19)
这是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()
});
答案 2 :(得分:9)
试试这个:
$.when($.ajax('translations'), $.ready).then(function() {
// Start doing stuff here
});
答案 3 :(得分:6)
我的版本是:
$.when(
$.Deferred(function() { $(this.resolve); }),
$.ajax('translations')).
then(function() { console.log("done"); });
答案 4 :(得分:2)
参考更新(2015年):
这在当前版本的jQuery中可用:
$.when($.ready).then(...);
使用highlandjs转换为流也很简单:
_($.when($.ready)).map(transform).pipe(output) // etc.
答案 5 :(得分:0)
jQuery' when
不是一个正确的承诺。你可以把它强制成这样一个:
function documentReady() {
return Promise.resolve($.when($.ready));
}
用法:
documentReady().then(function($) { ... });
恰好用$
来解决这个问题,这样也很方便。
替代实施:
function documentReady() {
return new Promise(r => $(r));
}