我的jQuery记录插入过程中遇到了两个问题,我希望这个很棒的SO社区可以帮助我解决其中至少一个问题。 这些是问题:
问题 1 - 间歇性服务器延迟
第一个问题与我的 Ubuntu 10.04 服务器在对 mySQL 数据库进行POST
数据时似乎表现出间歇性的 4.5 秒延迟。 大多数POST
命令都在正常的毫秒内执行,但是当发生延迟时,它似乎总是大约 4.5 秒。这不是一个繁忙的公共服务器,所以它不应该是服务器负载的问题。这些短视频展示了我试图解释的内容:
视频 1视频 2
我已经发布了一个关于服务器错误的问题,正在等待该论坛的一些意见,这可能更适合本问题 1。
问题 2 - jQuery POST 和 GET 方法的计时
我试图解决的真正问题是在所有对POST
的调用完成之前阻止对GET
的调用。 目前,我已经实施了$.when.apply
来延迟GET
的发送。 这是代码:
function(){
$.when.apply(undefined, InsertTheAPPs()).done(function (){
$.ajax({
url: sURL + "fileappeal/send_apps_email",
success: function() {
var m = $.msg("my message",
{header:'my header', live:10000});
setTimeout(function(){
if(m)m.setBody('...my other message.');
},3000);
setTimeout(function(){
if(m)m.close(function(){
window.location.replace(sURL+'client/view');
});
},6000);
$('#ajaxShield').fadeOut(1000);
},
error: function(){
$.msg("error message",
{header:'error header', live:10000});
}
});
});
}
我的问题是由于上述问题 1 中描述的延迟而出现的。在所有POST
方法开始后调用GET
方法,但我需要GET
方法等到所有POST
方法都结束。 这是我需要帮助的问题。 基本上,这里发生的事情是错误的是,在所有记录完全插入mySQL数据库之前,我的确认电子邮件正在发送。
下面是 jQuery $.each
循环的代码。 这是代码,不仅需要开始,而且必须在 ajax 调用上述fileappeal/send_apps_email
之前结束:
function InsertTheAPPs(){
$('input[name=c_maybe].c_box').each(function(){
var jqxhrs = [];
if($(this).prop('checked')){
var rn = $(this).prop('value');
jqxhrs.push(
$.ajax({
url: sURL + 'fileappeal/insert_app',
type:"POST",
dataType: 'text',
data: {'rn': rn},
error: function(data) {console.log('Error:'+rn+'_'+data);}
})
)
return jqxhrs;
}
});
}
有人对我如何解决服务器延迟问题并防止在所有POST
方法完成之前调用GET
有任何建议吗? 谢谢。
你的帖子有一个小问题。 解决它后,这篇文章应该可以帮助你完成你的代码: jQuery Deferred - 等待多个 AJAX 请求完成
您将在.each
内返回,但函数本身不会返回任何内容。 因此,您的延迟不会被赋予要等待的 ajax 调用数组。 而且,由于您的 jqhrs 是在 each 内部定义的,因此范围是每个c_box的每次迭代。 您的方法应如下所示:
function InsertTheAPPs(){
var jqxhrs = [];
$('input[name=c_maybe].c_box').each(function(){
if($(this).prop('checked')){
var rn = $(this).prop('value');
jqxhrs.push(
$.ajax({
url: sURL + 'fileappeal/insert_app',
type:"POST",
dataType: 'text',
data: {'rn': rn},
error: function(data) {console.log('Error:'+rn+'_'+data);}
})
)
}
});
return jqxhrs;
}
您还可以使代码更轻松。 由于您只想知道是否检查了某些内容,因此您可以使用 jquery 伪类过滤器:checked
例如:
function InsertTheAPPs(){
var jqxhrs = [];
$('input[name=c_maybe].c_box').filter(':checked').each(function(){
var rn = $(this).prop('value');
jqxhrs.push(
$.ajax({
url: sURL + 'fileappeal/insert_app',
type:"POST",
dataType: 'text',
data: {'rn': rn},
error: function(data) {console.log('Error:'+rn+'_'+data);}
})
)
});
return jqxhrs;
}
您可以将:checked
上的过滤器组合到主过滤器中,例如$('input[name=c_maybe].c_box:checked')
但我将其保留为长格式以真正演示正在发生的事情。