我有两个ajax调用,一个使用.post(),另一个使用.ajax()(用于测试)。一个是作为间隔检查触发的,另一个是在foreach循环下发送邮件。问题是间隔检查仅在第二个ajax调用完成后返回结果,而不是在期间 - 这是我想要实现的。我得到了我想要的结果 - 就在我目前的代码结尾处:
$("#cdj-email-members").click(function() {
$(".cdj-email-content").slideUp();
$(".cdj-send-email").show();
// Disable the buttons
$("#save-email").hide();
$("#cdj-email-members").hide();
$("#cdj-test").attr('disabled','disabled');
// Declare the variables
var cdj_subject = $("#cdj-email-form #subject").val();
var cdj_content = $("#cdj-email-form textarea").val();
var cdj_fan_count = $("#cdj-progressbar").prop('max');
var cdj_email_members_nonce = $("#cdj_email_members_nonce").val();
// Set the interval check
setInterval(function(){
var data = {
'action': 'cdj_update_progress_bar',
};
$.post(cdjAjax.ajaxurl, data, function(response) {
var result = jQuery.parseJSON(response);
console.log(result);
$("#cdj-progressbar").attr('value', result);
});
},500);
// Send the Ajax request
$.ajax({
url: cdjAjax.ajaxurl,
type: 'POST',
data: {
action: 'cdj_email_members',
nonce: cdj_email_members_nonce,
'fan_count': cdj_fan_count,
'subject': cdj_subject,
'content': cdj_content
},
cache: false,
success: function(data) {
// Retreive the WordPress response
var status = $(data).find('response_data').text();
var message = $(data).find('supplemental message').text();
if(status == 'success') {
console.log(message);
$(".send-email-success").slideDown();
$(".send-email-success p.message").text(message);
$(".send-email-success").delay(4000).fadeOut();
// Enable the buttons
$("#save-email").show();
$("#cdj-email-members").show();
$("#cdj-test").prop('disabled', false);
// Switch back to content view
$(".cdj-email-content").delay(2000).slideDown();
$(".cdj-send-email").delay(2000).hide();
}
else {
console.log(message);
$(".send-email-error").slideDown();
$(".send-email-error p.message").text(message);
$(".send-email-error").delay(4000).fadeOut();
}
}
});
});
由于
答案 0 :(得分:0)
问题是setInterval(function() {..},500);
每隔500毫秒调用一次这个函数,但第一次调用只会在前500ms过后,而不是立即调用。
这就是$.ajax
首先运行的原因。
同样发生的是两个调用都是通过HTTP进行的,并且根据您的服务器配置(简单地说),对同一URL的两次调用可以排成队列,这就是为什么$.ajax
等待{{} 1}}完成。
要解决此问题,我会将$.post
置于setInterval
$.ajax
函数内(确保首先调用success
,然后在500毫秒间隔内运行$.ajax
事后)