Выполнение синхронного и асинхронного AJAX одновременно - PullRequest
2 голосов
/ 31 марта 2012

Я хочу запустить AJAX, чтобы получить некоторые данные URL, построить объект из данных и назначить его глобальной переменной объекта. Итак, я знаю, что мне нужно выполнить синхронный запрос ajax. (Верно?) Ну, я также хочу использовать настройку beforeSend , чтобы дать моим пользователям экран загрузки. (Я, наверное, сначала должен спросить, является ли beforeSend единственный способ добиться этого?) Как я могу объединить преимущества синхронизации и асинхронности?

асинхронный:

$.ajax({
        url:'scripts/scripts.php?call=page&url='+thisurl, /*local*/
        dataType:'html',
        beforeSend:function(){
            $('#display').html('<div class="loading"></div>');
        },
        success:function(data, textStatus, jqXHR){
            /*local*/ myobj = getMyObj(data); $('#display').html(myobj);
        },
        error:function(jqXHR, textStatus, errorThrown){ }
});

синхронизация:

$.ajax({
        url:'scripts/scripts.php?call=page&url='+thisurl, /*local*/
        dataType:'html',
        async:false,
        success:function(data, textStatus, jqXHR){
            /*global*/ myobj = getMyObj(data);
        }
});
$('#display').html(myobj);

извините, если это не имеет смысла

Ответы [ 2 ]

2 голосов
/ 31 марта 2012

Э-э, ну, вполне очевидно, что если вы хотите отобразить что-то перед синхронной функцией AJAX, вы делаете:

$('#display').html('<div class="loading"></div>');
$.ajax({
        url:'scripts/scripts.php?call=page&url='+thisurl, /*local*/
        dataType:'html',
        async:false,
        success:function(data, textStatus, jqXHR){
            /*global*/ myobj = getMyObj(data);
        }
});
$('#display').html(myobj);

С другой стороны, зачем использовать синхронную функцию Ajax, это действительно плохая идея, вместо этого использовать обещания или что-то вроде:

var Ajax = $.ajax({
              url:'scripts/scripts.php?call=page&url='+thisurl,
              dataType:'html'
           });

//do something later
$("#mybutton").on('click', function() {
    Ajax.done(function(data) {         //if/when the ajax function is completed
        $('#display').html(data);
    });
});        

Или вставьте ajax в отдельную функцию и запустите ее так же, есть много опций, кроме синхронных вызовов Ajax!

0 голосов
/ 31 марта 2012

Скорее всего, вы не хотите делать синхронный AJAX-запрос. Из jQuery.ajax документации:

Обратите внимание, что синхронные запросы могут временно блокировать браузер, отключая любые действия, когда запрос активен

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

...