Рекурсивный обратный вызов AJAX по завершении

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

Определите, что означает all, сделайте так, чтобы delete_all_data вернул истину или ложь, независимо от того, есть ли еще что-то для удаления, и перенаправьте, только если больше нечего удалять. Что-то вроде того.

Adelin 18.06.2018 09:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
693
2

Ответы 2

Вы можете передать метод 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.

Roamer-1888 20.06.2018 15:21

Другие вопросы по теме