Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor observe更改服务器上添加的回调对所有项目激发_Javascript_Meteor - Fatal编程技术网

Javascript Meteor observe更改服务器上添加的回调对所有项目激发

Javascript Meteor observe更改服务器上添加的回调对所有项目激发,javascript,meteor,Javascript,Meteor,正在服务器上调用此代码。每次meteor服务器启动时,added函数会为数据库中的每个项目激发。是否有方法仅在添加新项目时才让添加的回调触发?添加的将在第一次运行observeChanges时为结果集中的每个文档调用。诀窍是在初始化期间忽略回调。在我对问题的回答中有一个扩展的示例,但此代码应该适用于您: Tracker.autorun(function() { DATA.find().observeChanges({ added: function(id, doc) {

正在服务器上调用此代码。每次meteor服务器启动时,
added
函数会为数据库中的每个项目激发。是否有方法仅在添加新项目时才让添加的
回调触发?

添加的
将在第一次运行
observeChanges
时为结果集中的每个文档调用。诀窍是在初始化期间忽略回调。在我对问题的回答中有一个扩展的示例,但此代码应该适用于您:

Tracker.autorun(function() {
  DATA.find().observeChanges({
    added: function(id, doc) {
       console.log(doc);
    }
  });
});

请注意,这是一个仅限客户端的函数。在服务器上,我认为它只执行过一次。

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

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

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

因为这是初始化问题,所以您可以这样做

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);
        }
    }
});

这实际上更优雅。

这里有另一种解决方法:

Meteor.subscribe('messages',function()){ var messages=messages.find(); var msgCount=messages.count(); 注意({ 添加数据:函数(文档,索引){ if(atIndex>(msgCount-1))console.log('added'); } }); });
应仅针对在现有金额交付后添加的文档激发。这在
Meteor.subscribe
onReady
回调中很重要,以便
msgCount
随着订阅的变化而变化。。。例如,如果您正在对订阅进行分页


为与旧项不匹配的查询提供选择器。如果将mongo ObjectID用作
\u id
,则可以查询
\u id
大于最新项目的项目:

var observerOfMessages = Messages.find({}).observe({
    added: function(doc){
        if(!observerOfMessages) return;
        console.log(doc)
    }
});
或使用
createdAt
时间戳:

const latest = DATA.findOne({}, {sort: {_id: -1}})
DATA.find({_id: {$gt: latest._id}}).observeChanges({
  added: function() { ... }
})

这太简单了,我好几天都想不出来。谢谢你!我真愚蠢,竟然没有意识到Deps.autorun只是一个客户端。现在我还有一个问题…如果你能解释一下。如果我在一个非常大的集合上运行这个函数,并且从不调用stop,那么现在Meteor使用oplog,它会对我的系统造成严重的负担吗。@你想要after和before hooks功能吗@PeppeL-G所以你会说使用前后挂钩比观察变化更好?假设我的用例是每次将文档添加到集合中时,修改它,然后将其添加到另一个集合中。另外,我刚刚浏览了整个文档。它看起来很像观测变化。有什么区别吗?@Bads只是把它作为一种选择。我认为这个包不适用于游标,所以我认为这个解决方案不会有您在解决方案中提到的内存缺陷(如果存在)。@PeppeL-G。我明白了。谢谢我将对这两种解决方案进行试验。@chaintng
profiles
可能是John在出版Meteor.users
收藏的地方命名他的出版物的方式
const currentTime = new Date()
DATA.find({createdAt: {$gt: currentTime}}).observeChanges({
  added: function() { ... }
})