Javascript 正在合并$.get和$.ready
简单地说,我有一个ajax调用,有时会在加载页面之前完成,因此我尝试将回调包装在Javascript 正在合并$.get和$.ready,javascript,jquery,ajax,race-condition,Javascript,Jquery,Ajax,Race Condition,简单地说,我有一个ajax调用,有时会在加载页面之前完成,因此我尝试将回调包装在$(fn)中,但如果加载页面,回调不会触发。。。有人有好的解决办法吗 $.get( '/foo.json', function( data ){ $( function(){ // won't get here if page ready beats the ajax call // process data $( '.someDiv' ).append( s
$(fn)
中,但如果加载页面,回调不会触发。。。有人有好的解决办法吗
$.get( '/foo.json', function( data ){
$( function(){
// won't get here if page ready beats the ajax call
// process data
$( '.someDiv' ).append( someData );
} );
} );
是的,我知道如果我改变了它们的顺序,它将始终工作,但是我的ajax调用将被不必要地推迟到文档准备就绪。否,添加到onDOMready的函数将始终被执行,并且如果事件已经发生,将立即被执行。请参阅:处的文档,仅当您使用
$(document).bind(“ready”)
事件已触发时,它将不会执行
非触发事件处理程序的一个可能原因是其他处理程序抛出错误。jQuery有一个待执行处理程序的内部数组,处理本机DOM加载事件的方法只是对其进行迭代。如果其中一个早期处理程序出现错误,循环将中断,随后添加的其他处理程序将不会被调用。将结果加载到全局变量中,并将其加载到DOM就绪状态。关键是,如果结果为空,则使用
setTimeout
进行迭代,直到结果为空为止
var result;
$.get("/foo.json", function(data) {
result = data;
});
function insertAJAX() {
if(result !== undefined) {
$(".someDiv").append(result);
} else {
setTimeout(insertAJAX, 250);
}
}
$(function() {
insertAJAX();
});
注意,您可以添加一个超时计数器,在一定时间后停止尝试,以防AJAX由于任何原因永远不会返回结果
var result;
$(document).on('ready.specialAjax', function () {
if (result) {
$(".someDiv").append(result);
}
});
$.get('/foo.json').done(function (data) {
if ($(".someDiv").length) {
$(".someDiv").append(data);
$(document).off('ready.specialAjax');
}
else {
result = data;
}
});
本质上,如果可以的话,ajax将尝试立即附加到someDiv。否则,它会将ajax结果存储在
result
和document.ready
中,并在运行时自行追加。执行.off
是为了防止在ajax成功添加数据的情况下添加两次数据。这不重要,因为在这种情况下,结果将是空的,只是为了保持干净。您需要检查AJAX回调中的dom是否就绪,以确保是在就绪后追加还是立即追加。参见下面的代码
var isDomReady = false;
$.get( '/foo.json', function( data ){
if (isDomReady) {
$(function(){ $('.someDiv').append( someData ); });
} else {
$('.someDiv').append( someData );
}
} );
$(function(){
isDomReady = true;
// and all you ready code
});
这样做没有坏处
var getData;
$.get( '/foo.json', function( data ){
getData = data;
});
$(function() {
var intt = setTimeinterval(function() {
if(getData.length) {
//do your task
clearInterval(intt);
}
}, 100);
});
下面是另一个使用延迟的方法。显然,您可以在
文档中使用延迟。ready
,这有点奇怪:
$(document).data("readyDeferred", $.Deferred()).ready(function() {
$(document).data("readyDeferred").resolve();
});
var jqxhr = $.get('/foo.json');
$.when(jqxhr, $(document).data('readyDeferred'))
.done(function (jqxhr) {
$(".someDiv").append(jqxhr[2].responseText);
});
那很好。它们不是:)确切的代码:
~函数($,RC){$.getJSON('json/financial plan.json',函数(accounts){console.log('step1');$(函数(){console.log('step2');$.replaceTmpl('financial_plan_template');WBR.initSection('financial plan');})}(jQuery,window.RazorCharts)代码>step1
始终被记录<代码>第二步
有时会。@cwolves,是的,他们是。您的代码有其他问题@Bergi——代码是一样的:)只是指出我什么都没做different@cwolves:当然是这样,否则它会起作用:-)让我猜猜:您在代码中的某个地方添加了其他onload处理程序?@Bergi,不,这是旧版本jQuery中的一个bug。我将ready函数替换为一个函数,如果document.ready
已经启动并且现在可以运行,则立即触发回调。您还没有尝试过这个方法,是吗?@cWalves这不起作用的事实是$.ready
中的一个bug。它应该只是work@Raynos-嗯。我使用的是较旧版本的jQuery,因为这是一个现有项目。可能需要修补。我喜欢这个答案。这正是自定义事件处理程序的用途。如果在DOM就绪后完成AJAX需要100毫秒以上,该怎么办?在这种情况下,设置间隔总是不好的。。您永远不知道返回响应需要多长时间。@SKS,您是什么意思?下一轮比赛后,间隔时间会检查吗100ms@Statx嗯。。我的错。。但仍然不是处理这个案件的好方法。