2013-02-27 3 views
1

Можно ли добавить обратный вызов в этот цикл? Как способ сообщить приложению «теперь пришло время сделать это ..» ..?

$(xml).find("book").each(function(){ 
    var id = $(this).find("id").text(); 
    var x = $(this).find("x").text(); 
    var y = $(this).find("y").text(); 
    var z = $(this).find("z").text(); 

    hasItem(id, x, y, z, function(flag, id, x, y, z) { 
     if(!flag) { 
      //doing something 
     } 
    }); 
}); 

//add callback to tell me that all rows of xml has been read and hasItem is done reading? 
+0

Просто позвоните в функцию. Почему нет? – Alexander

+4

Нет, нет. Это синхронная операция, поэтому обратный вызов не требуется для $ .each. Однако, если '// делать что-то' делает асинхронное действие, такое как ajax, вам нужно будет использовать отложенные объекты для отслеживания, когда все они будут завершены. –

+0

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

ответ

1

, даже если это асинхронная операция, почему бы вам не вызвать функцию после завершения?

function done(){ 
    // completed... 
} 
var total = $(xml).find("book").length; 
$(xml).find("book").each(function(index, element){ 
    var id = $(this).find("id").text(); 
    var x = $(this).find("x").text(); 
    var y = $(this).find("y").text(); 
    var z = $(this).find("z").text(); 
    hasItem(id, x, y, z, function(flag, id, x, y, z) { 
     if(!flag) { 
      //doing something 
      if(total == index+1) 
       done(); 
     } 
    }); 
}); 
+0

Я думаю, что это был бы лучший способ. Но я предлагаю объявить выполненную функцию перед выполнением каждого цикла. – jnpWebDeveloper

+0

@jnpWebDeveloper вы правы, исправили его :) –

+0

спасибо, это то, что я закончил делать! :) –

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