2012-03-31 1 views
2

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

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

$.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); 

жаль, если это не имеет смысла

+0

Как использовать [веб-рабочий] (https://developer.mozilla.org/En/Using_web_workers), если HTML5 является вариантом? – Bakudan

+0

Wow, у них есть эти?! ... Я думал, что было бы здорово, если бы это было. Программисты все подумали. Я буду исследовать это. Теперь это всего лишь вещь HTML5? – philtune

+0

Да, это так, поэтому IE ограничивается версией 10. Но в других версиях их браузеры выглядят нормально. Вы можете сделать будущее готовым, используя его и добавив резервную копию с помощью обычного решения jQuery. – Bakudan

ответ

2

Ehm, ну, это довольно очевидно, что если вы хотите отобразить что-то до синхронной функции 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 звонков!

+0

Хорошо, я никогда не видел этого раньше (.done) ... Я на самом деле думаю, что это именно то, что я хотел. Я полагаю, что вместо синхронного я хочу сохранить загружаемые страницы в глобальную переменную и запускать только ajax, если у меня еще нет данных для этой страницы. Я получил эту идею от Gmail, как вы можете просматривать сообщения, которые вы уже просматривали, без необходимости запуска нового потока. Я предполагаю, что gmail просто сохраняет данные в глобальной переменной и вспоминает об этом, если на нее уже смотрели. – philtune

+0

где я могу найти документацию по этому (.done, .fail, .always)? Я могу найти ссылки на него в файле .ajax(). – philtune

+0

gmail использует SPDY (ускоренную), собственную реализацию веб-сокетов в Google. done(), fail() и always() будут работать в более новых версиях jQuery на $ .ajax, а $ .post - всего лишь ярлык для функции $ .ajax. – adeneo

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^