Ajax等待其他功能完成问题

时间:2015-02-28 16:46:32

标签: php jquery ajax wordpress

我有两个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();
            }

        }

    });

});

由于

1 个答案:

答案 0 :(得分:0)

问题是setInterval(function() {..},500);每隔500毫秒调用一次这个函数,但第一次调用只会在前500ms过后,而不是立即调用。

这就是$.ajax首先运行的原因。

同样发生的是两个调用都是通过HTTP进行的,并且根据您的服务器配置(简单地说),对同一URL的两次调用可以排成队列,这就是为什么$.ajax等待{{} 1}}完成。

要解决此问题,我会将$.post置于setInterval $.ajax函数内(确保首先调用success,然后在500毫秒间隔内运行$.ajax事后)