Meteor JS:循环加载的数据量很大

时间:2014-03-18 19:27:44

标签: javascript meteor

我有一个加载作业集合的应用程序

Deps.autorun(function(){
  var onet = Session.get('currentIndustryOnet');
  var city_id = Session.get('currentMapArea');
  jobsSubscription = Meteor.subscribe('jobs', onet, city_id);

  console.log(onet);

  if(jobsSubscription.ready) {
    Session.set('jobCount', Jobs.find().count());
  }
});

Template.selector.events({
  'click div.select-block ul.dropdown-menu li': function(e) {
    var selectedIndex = $(e.currentTarget).attr("rel");
    var val = $('select#industryPicker option:eq(' + selectedIndex + ')').attr('value');
    var oldVal = Session.get('currentIndustryOnet');

    if(val != oldVal) {
      Session.set('jobsLoaded', false);
      Session.set('currentIndustryOnet', val);
    }
  }
});

console记录变量onet的20+值。似乎Meteor.autorun只运行一次。这是正常的吗?如果没有,我如何解决此问题只运行一次?

更新:

Jobs = new Meteor.Collection('jobs');
Cities = new Meteor.Collection('cities');
Pagination.style('bootstrap');

Session.setDefault('jobCount', null);
Session.setDefault('jobsLoaded', false);

Meteor.subscribe('cities');

Session.set('jobCount', Jobs.find().count());

Deps.autorun(function(){
  var onet = Session.get('currentIndustryOnet');
  var city_id = Session.get('currentMapArea');
  Meteor.subscribe('jobs', onet, city_id, function onReady(){
    Session.set('jobsLoaded', true);
  });

  Session.set('jobCount', Jobs.find().count());
});

function plotCities() {
  console.log("CITIES PLOTTING");
  // var jobs = Jobs.find().fetch();
  // var addresses = _.chain(jobs)
  //             .countBy('address')
  //             .pairs()
  //             .sortBy(function(j) {return -j[1];})
  //             .map(function(j) {return j[0];})
  //             .slice(0, 50)
  //             .value();

  // gmaps.clearMap();
  // $.each(_.uniq(addresses), function(k, v){
  //   var addr = v.split(', ');

  //   Meteor.call('getCity', addr[0].toUpperCase(), addr[1], function(error, city){
  //     if(city) {
  //       var opts = {};
  //       opts.lng = city.loc[1];
  //       opts.lat = city.loc[0];
  //       opts.population = city.pop;
  //       opts._id = city._id;
  //       gmaps.addMarker(opts);
  //     }
  //   });
  // })
}

Template.list.jobs = function() {
  plotCities();
  return Pagination.collection(Jobs.find({}).fetch());
}

console.log('CITIES PLOTTING')在第一次加载页面时被调用大约8次,然后如果我切换Sessioned onet,并且作业重新加载数据,则调用次数为30次以上

更新2:

这是我的代码:

Session.set('jobsLoaded', false);

Meteor.subscribe('cities');

Session.set('jobCount', Jobs.find().count());

Deps.autorun(function(){
  var onet = Session.get('currentIndustryOnet');
  var city_id = Session.get('currentMapArea');
  Meteor.subscribe('jobs', onet, city_id, function onReady(){
    Session.set('jobsLoaded', true);
  });

  Session.set('jobCount', Jobs.find().count());
});

function plotCities() {
  var jobs = Jobs.find().fetch();
  var addresses = _.chain(jobs)
              .countBy('address')
              .pairs()
              .sortBy(function(j) {return -j[1];})
              .map(function(j) {return j[0];})
              .slice(0, 50)
              .value();

  gmaps.clearMap();
  $.each(_.uniq(addresses), function(k, v){
    var addr = v.split(', ');

    Meteor.call('getCity', addr[0].toUpperCase(), addr[1], function(error, city){
      if(city) {
        var opts = {};
        opts.lng = city.loc[1];
        opts.lat = city.loc[0];
        opts.population = city.pop;
        opts._id = city._id;
        gmaps.addMarker(opts);
      }
    });
  })
}

Template.list.jobs = function() {
  if(Session.equals('jobsLoaded', true)) {
    console.log("LOADED PLOT");
    plotCities();
  }

  return Pagination.collection(Jobs.find({}).fetch());
}

调用console.log("LOADED PLOT")时...第一次加载8次,第二次加载近40次......

1 个答案:

答案 0 :(得分:0)

每当内部使用的反应项更新时,

Deps.autorun重新运行。你的函数中有三个这样的项:两个会话变量和.ready()句柄。最有可能是最后一次导致多次重新运行。如果您确定在此期间未触及会话变量,则这是唯一的选择。

虽然我不确定这一点,但每次在订阅频道中提取新项目时,.ready()可能会失效。因此,在自动运行中进行此检查将导致多次初始重新运行,因为第一批数据被拉出。

在自动运行之外移动该检查(可以从外部看到订阅),问题应该解决。


啊,现在还有别的:你从plotCities打来Template.list.jobs,这也是被动的,每当Jobs.find({})中的某些内容发生变化时重新运行 - 所以每次都是新的初始项目已加载。

您有一个会话变量,您可以在其中标记您的订阅已准备就绪。用它来过滤通话:

Template.list.jobs = function() {
  if(Session.equals('jobsLoaded', true)) plotCities();
  return Pagination.collection(Jobs.find({}).fetch());
}