В одном из моих представлений я собираю коллекцию (user_id, date, # posts, avg post length), а затем выполняет некоторые математические вычисления по данным (например: суммирует общее число и длину сообщения avg.
Для этого я выполняю цикл с использованием подчеркивания каждой функции и создания нового представления (элемент - tr), который добавляется к таблице.
В конце цикла я вызываю плагин таблицы сортировки jquery для сортировки данных в таблице. Проблема, с которой я сталкиваюсь, заключается в том, что много раз каждый цикл не завершился, прежде чем я вызову таблицу сортировки jQuery. Я настроил его так, что задержка перед вызовом jquery, но это более элегантное решение, которое будет работать в 100% случаев в этом сценарии.
var size = _.size(userposts);
_.each(userposts, function(post) {
var sum = 0;
var totposts = 0;
j++;
_.each(post, function(times) {
sum += (times.get("posts") * times.get("avgpost"));
totposts += times.get("posts");
});
if(post[0].get("userId")){
var tempuser = new User({id: post[0].get("userId")});
tempuser.fetch({ success: function() {
$("#user-posts").append(new UserPostView({data: {name: tempuser.get("name"), num: totposts, avg: parseInt((sum / totposts))}}).render().el);
}});
}
if (j == size) {
formatTable();
}
});
Так что, возможно, я упускаю ваши вопросы, но чтобы все это вышло, у вас есть:
цикл (или набор петель)
событие, которое должно срабатывать в конце цикла?
Таймер большой нет! Что делать, если этот процесс занимает больше времени на других компьютерах? Или мобильное устройство? Вы никогда не хотите полагаться на таймеры, чтобы ставить в очередь вызовы функций, которые полагаются на предварительно существующие данные, особенно без резервного копирования.
Есть два способа, я могу думать об этом
var loopStatus = 0;
for (var i = 0; i < n; i++){
someMethod();
loopStatus++
if (loopStatus = n){
someMethod2();
}
}
или вы могли бы просто использовать некоторое время с вызовом someMethod2() в конце его, вне цикла