Проблемы с порядком загрузки Backbone jQuery

0

В одном из моих представлений я собираю коллекцию (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();
  }
});
  • 0
    Где именно асинхронная часть в шагах, которые вы описываете?
  • 0
    Вы выполняете асинхронную задачу в функции итератора каждого? Чтобы помочь вам в дальнейшем, вставьте код здесь.
Показать ещё 1 комментарий
Теги:
backbone.js

1 ответ

0

Так что, возможно, я упускаю ваши вопросы, но чтобы все это вышло, у вас есть:

цикл (или набор петель)

событие, которое должно срабатывать в конце цикла?

Таймер большой нет! Что делать, если этот процесс занимает больше времени на других компьютерах? Или мобильное устройство? Вы никогда не хотите полагаться на таймеры, чтобы ставить в очередь вызовы функций, которые полагаются на предварительно существующие данные, особенно без резервного копирования.

Есть два способа, я могу думать об этом

var loopStatus = 0;

for (var i = 0; i < n; i++){
someMethod();

loopStatus++

if (loopStatus = n){
 someMethod2();

}

}

или вы могли бы просто использовать некоторое время с вызовом someMethod2() в конце его, вне цикла

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню