Убедившись, что все элементы обрабатываются в jQuery вызова


У меня есть кусок кода, аналогичные ниже:

Но я продолжаю имея такое неприятное чувство, что там должен быть более простой способ! Любые идеи?

var synch = false
var indexArray = new Array();
var rowCount = theTable.find('tr').length;
$(".views").each(function(index) {
    indexArray.push( $(this).val()); // Not the real code but something to this effect
    if (rowCount <= (index+1)) synch = true;
});
while (!synch);
DO something with indexArray.....


812
4
задан 5 февраля 2011 в 07:02 Источник Поделиться
Комментарии
2 ответа

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

(Кстати, эта функция у вас там могут быть переписаны для большей эффективности)

var indexArray = $('.views').map(function(){
return this.value;
}).get();


Давайте предположим, что вы находитесь делать что-то асинхронность в каждом цикле, например, Ajax-вызовы. Ваш лучший выбор, чтобы сохранить счет, сколько звонков завершена в функции обратного вызова, а затем выполнение остальной части кода, когда функция обратного вызова вызывается:

var views = $('.views'), 
completed = 0,
total = views.length;

views.each(function(){
someAsyncFunction (function(){
// Process data
if(++completed === total) {
// We're done! Let's move on..
}
});
});

Это может быть абстрагированы в другой функции, хотя делает, что остается в качестве упражнения для читателя.

3
ответ дан 5 февраля 2011 в 09:02 Источник Поделиться

Ответ, который я искал, был очень прямо вперед.

Все необходимо поставить jQuery в режиме synchronis поместив используя

$.ajaxSetup({async:false});

а потом делаю AJAX-вызовы с помощью $.пост("...

затем просто снова ее включать

$.ajaxSetup({async:true});

0
ответ дан 15 февраля 2011 в 11:02 Источник Поделиться