Несколько вызовов Ajax, пока один вызов Ajax все еще выполняется

У меня есть некоторые проблемы с обновлением панели прогресса. Что мне нравится делать, так это запускать вызов ajax, для завершения которого требуется некоторое время, и во время этого вызова я хотел бы запускать вызовы ajax, установленные с интервалом, для обновления моего индикатора выполнения.

Так как я не смог найти решение и нашел только ограничение Браузера, которое подходило бы здесь. Всегда максимум 2 активных вызова.

Тем не менее, мой второй вызов остается в ожидании в Google Chrome, пока не завершится мой первый (основной) вызов.

РЕДАКТИРОВАТЬ: полный скрипт jquery

// update cars cache
$('#cars_cache_update_run').bind('click', function(){
    // remove button
    $(this).remove();

    // hide import widgets
    $('#products_import_widget').css('display', 'none');
    $('#vehicles_import_widget').css('display', 'none');
    $('#orders_import_widget').css('display', 'none');
    $('#test_data_widget').css('display', 'none');

    // show blind
    $('#cars_cache_update_info').css('display', 'none');
    $('#cars_cache_update_blind').css('display', 'inline');

    var carsUpdateInterval = setInterval(function() {
        getImportState('http://localhost/index.php/import/import_state/cache_update', 'cars_import_progressbar');
    }, 1000);
    // ajax request
    $.ajax({
        url: "http://localhost/index.php/import/cars_cache",
        async : true,
        success: function(data){
            $('#cars_cache_update_blind').css('display', 'none');
            $('#cars_cache_update_success').css('display', 'inline');
            clearInterval(carsUpdateInterval);

        },
        error: function(thrownError){
            $('#cars_cache_update_blind').css('display', 'none');
            $('#cars_cache_update_error').css('display', 'inline');
            $('#cars_cache_update_error_msg').html(thrownError);
        }
    });
});

function getImportState(url, id)
{
    $.ajax({
        url: url,
        success: function(data){
            var json = $.parseJSON(data);

            $.each(json, function(i, item) {
                var progressbar_value = json[i]['state'];
                $( "#"+id ).progressbar({
                    value: progressbar_value
                });
            })
        }
    });
}

Еще забавно, если я вызову запрос интервала через $.get, я получу странную ошибку.. Работа с Codeignitor Framework.

GET http://localhost/[object%20Object] 404 (Not Found) jquery.1.7.min.js:4
send jquery.1.7.min.js:4
f.extend.ajax jquery.1.7.min.js:4
f.(anonymous function) jquery.1.7.min.js:4
(anonymous function)

Большое спасибо за вашу помощь, уже несколько часов пытаюсь.. Может быть, я просто нуб.. Ха-ха.

безродный


person rootless    schedule 17.12.2012    source источник
comment
возможный дубликат несколько вызовов ajax одновременно   -  person Brad Christie    schedule 17.12.2012
comment
Как вы справляетесь с этим на стороне сервера, так как часто могут возникать проблемы только с запросом на сеанс и т. д. при выполнении нескольких вызовов ajax к одному и тому же бэкэнду.   -  person adeneo    schedule 17.12.2012
comment
пробовал инкапсулировать во внешней функции, безуспешно.   -  person rootless    schedule 17.12.2012
comment
adneo: Я просто вызываю контроллер/метод в Codeigniter Framework.. Не думал об этом. Знаете ли вы, как протестировать или затем увеличить значение запросов за сеанс?   -  person rootless    schedule 17.12.2012


Ответы (1)


Не вызывайте несколько ajax с интервалами. Попробуйте что-то вроде этого:

function updateProgress(){
    $.ajax({
        url: "http://localhost/index.php/import/import_state/cache_update",
        success: function(data){
            var json = $.parseJSON(data);
            $.each(json, function(i, item) {
                var progressbar_value = json[i]['state'];
                $( "#cars_import_progressbar" ).progressbar({
                    value: progressbar_value
                });
            });
            updateProgress(); // after success, call the same function again
        }
    });
}

updateProgress(); // start updateProgress

Надеюсь, поможет :]

person Leabdalla    schedule 17.12.2012
comment
теперь я понимаю, что вы имели в виду - я попытался поместить запрос updateProgressFile перед фактическим запросом updateFile. результат закончился одним запросом updateProgressFile, и после вызова updateFile он снова зависает в ожидании.. - person rootless; 18.12.2012