Выполнение функции после завершения каждого цикла - PullRequest
1 голос
/ 23 ноября 2010

Привет, я работаю над циклом jQuery each (), содержащим ajax-запрос и setTimeout.Это вызывает у меня некоторые проблемы с потоком программы.

xml_queries: function (data) {
    var values = [];

    // ...

    $.each(data, function(index, value) {

        // ...

        // Start xml query
        var i = 0;
        get_data(value.value);

        function get_data(value) {
            $.ajax({
                type: 'POST',
                url: '/admin/scanner/get_music_data/' + value,
                dataTaype: 'json',
                success: function(response) {
                    if ( response === 'FALSE' ) {
                        // Start recursion - up to 3 Retries
                        if ( ++i <= 3 ) {
                            setTimeout(function() {
                                get_data();
                            }, 100);
                        } else {
                            // ...
                        }
                    } else {
                        values.push(response);
                    }
                }
            });
        }
    });
    // return values;
    console.log(values);
}

Моя проблема в том, что console.log () в последней строке запускается немедленно (пока цикл все еще обрабатывает данные).Нет ли легкой возможности дождаться окончания цикла?\:

С уважением!

1 Ответ

1 голос
/ 23 ноября 2010

Исходя из вашего текущего кода, наиболее простым способом было бы установить для параметра $ .ajax async значение false, чтобы принудительно выполнить синхронный запрос, заставляя JavaScript ждать его завершения, прежде чем продолжить выполнение последующих операторов (это не будет делать это для асинхронных запросов).

$.ajax(
   {
    type: 'POST',
    async: false,
    ...

Это будет блокировать ваш браузер на время каждого запроса (гадость). Еще один способ сделать это - изменить дизайн приложения таким образом, чтобы следующий вызов ajax вызывался из обратного вызова первого, например ::100100

$.ajax(
   {
    type: 'POST',
    ...
    success: function() {
        doAjaxThingie();
    }
...