Javascript 在Meteor中,observeChanges中的this.added和this.change未按预期运行

Javascript 在Meteor中,observeChanges中的this.added和this.change未按预期运行,javascript,meteor,Javascript,Meteor,我很抱歉标题含糊不清,帖子很长,但我很难描述我的行为。我试着用任何一种方式来解释 我有一个新闻提要页面,在那里我可以显示帖子。我只想显示比用户打开页面时旧的帖子,这样列表就保持被动,而不会在顶部添加新帖子。因此,我决定在发布函数中使用observeChanges,如下所示: Newsfeed = new Mongo.Collection('newsfeed'); if (Meteor.isServer) { Meteor.publish("newsfeed", function (in

我很抱歉标题含糊不清,帖子很长,但我很难描述我的行为。我试着用任何一种方式来解释

我有一个新闻提要页面,在那里我可以显示帖子。我只想显示比用户打开页面时旧的帖子,这样列表就保持被动,而不会在顶部添加新帖子。因此,我决定在发布函数中使用observeChanges,如下所示:

Newsfeed = new Mongo.Collection('newsfeed');

if (Meteor.isServer) {
    Meteor.publish("newsfeed", function (init_last_activity, limit) {
        var self = this;

        check(limit, Number);
        check(init_last_activity, Date);

        var init = true,
            count = 0;

        var handle = Newsfeed.find({},{
            'limit': limit,
            'sort': {'updated_time': -1}
        }).observeChanges({
            // when a post is added, we check if it's got an older
            // updated_time than the initial updated time field
            // generated on init and only if so, we display
            // the post to the client
            added: function(id, doc) {
                count++;
                console.log('++++ POST NR. ' + count + ' ++++ ('+id+')');
                console.log('Updated time:  ', doc.updated_time);
                console.log('Last activity: ', init_last_activity);

                if (doc.updated_time < init_last_activity) {
                    console.log('- - - - -');
                    console.log('ADDED!');

                    self.added('newsfeed', id, doc);

                    console.log('ID: ' + id);
                    console.log(' ');
                }
            },

            changed: function(id, fields) {
                console.log('Trigger changed for id:', id);
                self.changed('newsfeed', id, fields);
            }
        });

        init = false;

        this.ready();

        this.onStop(function() {
            handle.stop();
        });
    });
}
如您所见,有两篇文章被发送到客户端。现在,当同一个用户在几秒钟后试图“喜欢”第二个post ID:7pt3nbkkqgckj4g5fc时,会触发上述代码中的self.change,这种情况会发生:

I20141024-20:21:13.997(-7)? Trigger changed for id: 7pt3nBKqgCKJ4G5fc
I20141024-20:21:13.997(-7)? Exception in queued task: Error: Could not find element with id 7pt3nBKqgCKJ4G5fc to change
I20141024-20:21:13.997(-7)?     at _.extend.changed (packages/ddp/livedata_server.js:185)
I20141024-20:21:13.997(-7)?     at _.extend.changed (packages/ddp/livedata_server.js:397)
I20141024-20:21:13.997(-7)?     at _.extend.changed (packages/ddp/livedata_server.js:1154)
I20141024-20:21:13.997(-7)?     at Newsfeed.find.observeChanges.changed (app/collections/newsfeed.js:125:22)
I20141024-20:21:13.998(-7)?     at packages/mongo/observe_multiplex.js:163
I20141024-20:21:13.998(-7)?     at Array.forEach (native)
I20141024-20:21:13.998(-7)?     at Function._.each._.forEach (packages/underscore/underscore.js:105)
I20141024-20:21:13.998(-7)?     at Object.task (packages/mongo/observe_multiplex.js:157)
I20141024-20:21:13.998(-7)?     at _.extend._run (packages/meteor/fiber_helpers.js:145)
I20141024-20:21:13.998(-7)?     at packages/meteor/fiber_helpers.js:123
与几秒钟前附加到self.added函数的id完全相同。奇怪的是,如果我跳过if语句,不管发生什么都允许self.added运行,那么一切都会正常工作:

added: function(id, doc) {
    self.added('newsfeed', id, doc);
}
因此,尽管在前面的示例中调用了self.added,但似乎仅仅因为在if语句中调用self.added就破坏了代码


有人知道为什么会这样吗?我是否误解了添加和更改的功能?我很困惑:

这是一篇老文章,但我想我在这个链接上找到了一个错误的线索:所以对于将来遇到这个问题的人,请查看GitHub上的链接。
added: function(id, doc) {
    self.added('newsfeed', id, doc);
}