在帮助器中使用Meteor.call时的无限循环

时间:2015-07-22 07:10:00

标签: javascript methods meteor meteor-helper

我花了很多时间在我的流星应用程序上,现在用户进来了,它太慢了!几乎无法使用,特别是在移动设备上。

我不得不修改我的所有代码并尝试将所有逻辑传递给服务器,以便客户端不会过载。

但是,我遇到了很多问题。我尝试过所有类型的解决方案,但没有任何效果。

无论如何,这是手头的问题。当我尝试使用服务器端方法时,会触发一个无限循环,这将使服务器上的console.log成千上万次。

这是代码

on templates / question.js

Template.questionItem.helpers({
      editPermission: function(){
        var question = this
        Meteor.call('checkForEditPermission', question, function(error, result){
          console.log(result)
          Session.set('editPermissionVar', result)
        });
        return Session.get('editPermissionVar')
      }
  });

on server / question.js

  if (Meteor.isServer) {
  Meteor.startup(function() {
    Meteor.methods({
      checkForEditPermission: function(question) {
        if (Meteor.user() && (question.user_id == Meteor.userId())) {
          return true
        }
      }
    });
  });
}

这是一个非常简单的帮手。我有许多其他更复杂的助手,但我无法弄清楚如何将它们放在服务器端。我被教导要在客户端做事,从来没有意识到我超载它。

不确定这是否有帮助,但我以前所拥有的(客户端唯一帮助者)要简单得多:

editPermission: function(){
    if (currentUser && (this.user_id == currentUser._id)) {
      return true
    }
  }

不需要meteor.call。

问题是,你如何处理从客户端调用方法并将它们用作帮助程序。我尝试过很多东西,比如反应变量和会话变量,但似乎没什么用。我知道这个特殊的例子非常简单,并且不会花费太多的计算,但我认为原理与更复杂的助手相同。问题是如何将它们移动到服务器。

由于

1 个答案:

答案 0 :(得分:1)

  

问题是,你如何处理调用方法

我如何处理Meteor.call,它会对数据库进行更改,只显示带游标的数据。

例如,你有一些模板,如:

Template.exammple.events({'click .sth' : function(event){
    Meteor.call("serveside", {some: data});
    return false;
});

在'serverside'中,我得到了所有的调用或数据库查询/插入/更新等

和帮手:

Template.example.helpers({
    example : function(){
    return dbCollectionName.find();
    });

通过这种方式,我不需要使用Meteor.call来提取数据/结果。大多数情况下,我将结果保存为原始形状,然后在用光标拉动它们之后再调整diplaying。 MongoDB与meteor完美配合,如果你需要一些聚合,你可以使用这个扩展:Meteor Aggregate