2010-09-03 3 views
0

Я создаю скрипт списка рассылки, который использует ajax (async = false) для отправки электронных писем в кусках.JavaScript для цикла делает пользовательский интерфейс невосприимчивым

В основном цикл это:

var i = 0; 
for(i;i<num_rows;i=i+mxt){ 
    if($("#panic").val()=='1'){ 
     break; 
    } 
    perc = (i*100)/num_rows; 
    startThread(i,perc); 
} 

значение паники Tha устанавливается с помощью кнопки, проблема заключается в том, что во время цикла (который работает), я не могу взаимодействовать со страницей.

Что я делаю неправильно?

Спасибо

EDIT:

function startThread(i,perc){ 
l_a = i; 
l_b = mxt; 

headers = '&mail_from='+mail_from+'&mail_from_name='+mail_from_name+'&mail_subject='+mail_subject; 

$.ajax({ 
    type: "POST", url: "ajax/thread.php", data: "l_a="+l_a+"&l_b="+l_b+headers, 
    success: function(html){ $("#progressbar").progressbar({value: perc}); }, 
    async: false 
}); 
} 
+1

Звучит довольно нормально для меня. Сколько строк вы обрабатываете таким образом? –

+0

Более 30 тыс. Всего, 100 рядов на нитку. Эта вещь работает как шарм, единственная проблема заключается в том, что мне хотелось бы остановить ее до того, как она закончится. – 0plus1

+0

Можете ли вы предоставить код для 'startThread'? – GenericTypeTea

ответ

4

Ваше startThread() имя функции вводит в заблуждение, потому что JavaScript в веб-браузеров не только однопотоковый, но она разделяет те же нити с рендеринга страницы.

Поскольку вы используете async=false, вызов $.ajax становится блокирующей функцией, и это блокирует поток рендеринга страницы, что делает пользовательский интерфейс невосприимчивым.

Цитируя jQuery documentation (курсив):

асинхронной

По умолчанию: истинный

По умолчанию все запросы асинхронно (т.е. это устанавливается истина по умолчанию) , Если вам нужны синхронные запросы, установите для этого параметра значение false. Междоменные запросы и dataType: запросы «jsonp» не поддерживают синхронную работу. Обратите внимание, что синхронные запросы могут временно блокировать браузер, отключая любые действия, пока запрос активен.

Возможные решения:

  • Piggyback ваши данные в одном объекте JSON, и отправить только один запрос $.ajax. Если возможно, используйте async=true.
+0

Нет, вы ошибаетесь, попробуйте прокомментировать startThread из цикла for, и вы увидите, что это цикл, который не является вызовом ajax, который блокирует пользовательский интерфейс! – 0plus1

+0

Я хочу добавить что-то еще. Если вы запускаете цикл for с помощью ajax-вызовов (async), вы в основном уничтожаете цель этого. Каждый поток посылает куски электронной почты, затем останавливается. Если я запустил 100+ одновременных вызовов ajax, это будет так же, как отправка их всем на SMTP-сервер. – 0plus1

+0

@ 0plus1: Спасибо за downvote :) ... Однако оба блокируют. '$ .ajax()' с 'async = false' блокирует, пока сервер не вернет ответ. Обычно это несколько десятков/сотен миллисекунд ... Блоки цикла 'for' в зависимости от количества итераций. Выполнение 'while (true) {}' блокирует пользовательский интерфейс ... Я не знаю логики вашего приложения. Мой был просто попыткой показать вам, почему у вас возникли проблемы. –

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