【问题标题】:MeteorJS Infinite loop when using meteor call and meteor methodMeteorJS 使用流星调用和流星方法时的无限循环
【发布时间】:2016-08-24 03:01:59
【问题描述】:

我有一个示例代码,如下所示:

客户端助手:

getUsername: function (userId) {
  Meteor.call("getUsername", userId, function (err, result) {
    if(!err) {
      Session.set("setUsername", result);
    else {
      console.log(err);
    }
  });
  return Session.get("setUsername");
}

服务器

Meteor.methods({
   "getUsername": function (userId) {
      var x = Meteor.users.find({_id: userId}, {fields: {username:1}}).fetch()[0];
      return x.username;
   }
});

这段代码的结果是一个无限循环的用户名传递给客户端。有没有办法停止循环并仅传递客户端所需的数据?我相信反应性导致数据无限循环,我不知道如何停止它。我尝试在服务器中的查询中使用"reactive":false,但它不起作用。

【问题讨论】:

  • 为什么将用户名设置为会话而不是直接返回?
  • @Areca - 情况是这样,我想尽量减少订阅和发布。因此,与其在帖子模板上发布和订阅用户,不如将帖子 user_id 作为参数传递给助手,然后使用 Meteor.call 在服务器上查找用户 ID 并返回用户名。在我的 HTML 中是这样的:{{getUsername userId}}
  • 不要在助手中进行异步调用。在事件中执行它们,或者在这种情况下,模板的 onCreated 回调。顺便说一句,您所做的将比仅将用户名作为出版物的一部分发布要
  • @MichelFloyd - 好主意,让我试试看:)
  • @MichelFloyd - 我不确定如何将“userId”从 {{getUsername userId}} 传递给 template.onCreated 。 . .我正在使用 kurounin:pagination 这很难加入两个集合,这就是为什么我采用这种方法来获取帖子的用户 ID 并在服务器上进行查找,而不是订阅用户集合并在客户端上进行查找.

标签: javascript meteor


【解决方案1】:

根据您的示例代码,我假设您有一组帖子,并且您正在根据每个帖子的用户 ID 检索用户名。那么不要这样,你应该使用publish composite包来发布相关用户。

Meteor.publishComposite('getPosts', function (postIds) {
    return [{
        find: function() {
            return Posts.find({ _id: { $in: postIds }});
            // you can also do -> return Posts.find();
            // or -> return Posts.find({ /* or what ever your selector is to get the posts you need*/ });
        },
        children: [{
            find: function(post) {
                return Meteor.users.find({ 
                    id: post.userId //or the correct field in your post document to get user id 
                }, { 
                   fields: { 
                        "profile": 1
                   } 
                });
            }
        }}
    }]
});

这样,您的出版物将负责发布相关用户以及帖子。您不需要每次都使用方法并调用它们。

【讨论】:

  • 是的,我同意,如果您有我还没有的自定义分页,它可以正常工作。现在我正在使用 kurounin:pagination 并且他们没有能够使用 publishComposite 的发布功能。 .你知道与 publishComposite 兼容的分页包吗?谢谢你:)
  • @WebsiteIsFun 我从来没有为自己使用过分页包,但你可以看到我对这个问题的其他答案stackoverflow.com/questions/35194437/… ,它指定了如何通过在出版物上采用附加参数来对自己进行分页。我认为合并这两个答案将解决问题。
  • 太棒了,让我试试玩,我会回来的。非常感谢。
  • 我让页面正常工作,但我不知道如何将数据分组到每页 10 个。在您的示例代码中,我确实知道如何使用“posts-count”函数在每个页面上显示结果。
【解决方案2】:

如果您想在客户端模板中随处访问用户名(这就是您将其放入会话的原因),我不会在模板助手中设置它。我会在启动时设置它并从模板助手中的会话中获取用户名(不调用服务器方法)

如果您只需要一个模板中的用户名,因此您想从模板助手返回其值,请不要将其放入会话中,只需在服务器方法回调中返回即可。

【讨论】:

  • 实际上我使用助手只是为了暂时传递流星调用的值,因为无法传递流星调用回调。
猜你喜欢
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多