完成后的AJAX递归回调

时间:2018-06-18 07:02:13

标签: javascript jquery ajax promise

我有一个需要通过批处理删除的数据库。如下面的代码所示,根据数据库大小,可以有任意数量的step(当前批量迭代)。我想将函数redirect_to_homepage()放在下面的代码中,以便在最后一个批处理之后重定向到新页面。目前,只要response.success为真,它就会重定向,而我希望它等待delete_all_data()的所有迭代完成然后重定向。我怎样才能做到这一点?

jQuery.ajax({
    url: ajaxurl,
    type: 'POST',
    data: {
        'action': 'deactivation_form_submit',
        'form-data': form_data,
    }
}).done( function( response ) {

    if ( response.success ) {
        if ( response.data.delete_data ) {
            delete_all_data( 1, form_data );
        }

        redirect_to_homepage();
    }
});

// This is a recursive AJAX function.
function delete_all_data( step, form_data ) {
    jQuery.ajax({
        url: ajaxurl,
        type: 'POST',
        data: {
            'form': form_data,
            'action': 'give_do_ajax_export',
            'step': step,
        },
        dataType: 'json',
    }).done( function( response ) {
        if ( true !== response.success && ! response.error ) {
            delete_all_data( parseInt( response.step ), form_data );
        }
    });
}

2 个答案:

答案 0 :(得分:0)

您可以将redirect_to_homepage()方法作为回调传递,这将在达到所需条件时执行。

jQuery.ajax({
    .....
}).done( function( response ) {
    if ( response.success  response.data.delete_data ) {
         delete_all_data( 1, form_data, redirect_to_homepage ); //Pass function reference   
    }
});

// This is a recursive AJAX function.
function delete_all_data( step, form_data, cb ) {
    jQuery.ajax({
       .....
    }).done( function( response ) {
        if ( true !== response.success && ! response.error ) {
            delete_all_data( parseInt(response.step,10), form_data, cb);  //Pass function reference   
        }else{
            //At present assuming this 
            //Invoke the callback function 
            cb();  
        }
    });
}

答案 1 :(得分:0)

一个选项是对你的delete_all_data ajax调用使用同步ajax调用

function delete_all_data( step, form_data ) {
    jQuery.ajax({
        url: ajaxurl,
        async:false,
        type: 'POST',
        data: {
            'form': form_data,
            'action': 'give_do_ajax_export',
            'step': step,
        },
        dataType: 'json',
    }).done( function( response ) {
        if ( true !== response.success && ! response.error ) {
            delete_all_data( parseInt( response.step ), form_data );
        }
    });
}

这将停止执行重定向,直到执行delete_all_data的最后一次调用。

其他选项如果你不想使用同步调用,那么我们将函数作为函数如下

function delete_all_data( step, form_data ) {
    jQuery.ajax({
        url: ajaxurl,
        async:false,
        type: 'POST',
        data: {
            'form': form_data,
            'action': 'give_do_ajax_export',
            'step': step,
        },
        dataType: 'json',
    }).done( function( response ) {
        if ( true !== response.success && ! response.error ) {

            if(response.step != last) {/// check if this is not the last step
            delete_all_data( parseInt( response.step ), form_data );
           }
           else{
                ////// Your redirection code goes here (function call or direct window.location.href)
            }
        }
    });
}

告诉我们是否有帮助