在我的脚本加载后,我正在发出 Ajax 请求以获取一些翻译。这应该总是在文档准备好后返回,因为我在页面底部加载我的脚本,但我仍然很好奇是否有可能在文档就绪状态下获得延迟对象。
这样就可以确保在执行任何其他操作之前,文档都已准备好并且 Ajax 调用成功返回,例如:
$.when( $.ajax('translations'), document.ready())
.then(function(){
// Start doing stuff here
});
在我的脚本加载后,我正在发出 Ajax 请求以获取一些翻译。这应该总是在文档准备好后返回,因为我在页面底部加载我的脚本,但我仍然很好奇是否有可能在文档就绪状态下获得延迟对象。
这样就可以确保在执行任何其他操作之前,文档都已准备好并且 Ajax 调用成功返回,例如:
$.when( $.ajax('translations'), document.ready())
.then(function(){
// Start doing stuff here
});
您可以使用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.
});
这是 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()
});
尝试这个:
$.when($.ajax('translations'), $.ready).then(function() {
// Start doing stuff here
});
我的版本是:
$.when(
$.Deferred(function() { $(this.resolve); }),
$.ajax('translations')).
then(function() { console.log("done"); });
更新参考(2015):
这在当前版本的 jQuery 中可用:
$.when($.ready).then(...);
使用highlandjs转换为流也很简单:
_($.when($.ready)).map(transform).pipe(output) // etc.
jQuerywhen
不是一个正确的承诺。您可以将其强制为这样的:
function documentReady() {
return Promise.resolve($.when($.ready));
}
用法:
documentReady().then(function($) { ... });
它恰好可以解决,$
所以这也很方便。
替代实现:
function documentReady() {
return new Promise(r => $(r));
}