У меня есть база данных, которую нужно удалить с помощью пакетного процесса. Как показано в приведенном ниже коде, может быть любое количество 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 );
}
});
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете передать метод 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();
}
});
}
Один из вариантов - использовать синхронный вызов ajax для вашего вызова ajax 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 ) {
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)
}
}
});
}
Сообщите нам, если это поможет
Не используйте async:false.
Определите, что означает
all, сделайте так, чтобыdelete_all_dataвернул истину или ложь, независимо от того, есть ли еще что-то для удаления, и перенаправьте, только если больше нечего удалять. Что-то вроде того.