Meteor观察更改添加了对所有项目的服务器触发的回调

Bad*_*ads 13 javascript meteor

Tracker.autorun(function() {
  DATA.find().observeChanges({
    added: function(id, doc) {
       console.log(doc);
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

此代码正在服务器上调用.每次流星服务器启动时,该added函数都会触发数据库中的每个项目.有没有办法added只在添加新项目时触发回调?

Dav*_*don 21

addedobserveChanges首次运行时将为结果集中的每个文档调用.诀窍是在初始化期间忽略回调.我在回答这个问题时有一个扩展的例子,但这段代码对你有用:

(function() {
  var initializing = true;
  DATA.find().observeChanges({
    added: function(id, doc) {
      if (!initializing) {
        console.log(doc);
      }
    }
  });
  initializing = false;
})();
Run Code Online (Sandbox Code Playgroud)

请注意,Tracker.autorun是仅限客户端的功能.在服务器上我认为它只执行一次.


小智 9

我很长时间都在挣扎.出于某种原因,David的回答对我不起作用 - 它是在初始化变量设置为false后触发的.

Avi的这种模式对我来说很成功:

var usersLoaded = false;
Meteor.subscribe("profiles", function () {
    // at this point all new users sent down are legitimately new ones
    usersLoaded = true;
});

Meteor.users.find().observe({
    added: function(user) {
        if (usersLoaded) {
            console.log("New user created: ", user);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)