流星观察在1.6

时间:2017-12-15 23:48:41

标签: meteor

我最近从1.2升级到Meteors最新版本1.6.0.1。

我在发布中使用了观察并在客户端上进行了观察以获得更改。

在1.2中没有任何问题,但是在“已更改”的客户端回调中没有收到1.6观察到的更改,但客户端确实收到了ddp消息。我可以通过查看Chromes dev工具>来验证这一点。 websocket,查看传入消息,但它永远不会在客户端回调中触发。这仅在一次更改2-3个文档时发生。

因此,当我从数据库中删除一些文档时,发布会触发回调,客户端会在websocket消息中接收它们,但它只会在客户端的“观察”回调中触发一次。

这是我的代码。

客户 -

CollectionTest = new Meteor.Collection('collectionTest');


CollectionTest.find({}).observe({
   added: function (doc) {
      console.log("ADDED DOC ", doc);
   },
   changed: function (newDoc, oldDoc) {
      console.log("CHANGED DOC new ", newDoc);
   },
   removed: function (doc) {
      console.log("REMOVED DOC ", doc);
   }
});

服务器发布 -

Meteor.publish("ddpPub", function () {

    var self  = this,
        ready = false;

    var userId = self.userId;

    var subHandle = TestData.find({}).observeChanges({
        added: function (id, fields) {
            if (ready) {
                self.changed("collectionTest", userId, {
                    type: "added",
                    data: {
                        id: id,
                        fields: fields
                    }
                });
            }
        },
        changed: function (id, fields) {
            if (ready) {
                self.changed("collectionTest", userId, {
                    type: "changed",
                    data: {
                        id: id,
                        fields: fields
                    }
                });
            }
        },
        removed: function (id) {
            if (ready) {
                self.changed("collectionTest", userId, {
                    type: "removed",
                    data: id
                });
            }
        }
    });

    self.added("collectionTest", userId);
    self.ready();
    ready = true;

    self.onStop(function () {
        subHandle.stop();
    });
});

附件是我从DB中删除文档的图像。 websocket消息,然后是客户端上的控制台。显示它只会为5个文档触发一次。

Showing the document id's I am deleting

DDP messages in 'websocket' confirmed they get to client

Single client message in client callback showing only document changed

更新:太平洋标准时间12/15/17 - 太平洋标准时间下午7:17

在对此进行了几个小时的工作后,找到一些相关的meteor帖子,观察回调和“Meteor.call”无法在内部工作,解决方案或黑客是将“Meteor.call”包装在“setTimeout”中值为0,它修复了它。

我在这里尝试过,它没有用,但后来我试着限制响应,它有效!不确定它是否是一个可靠的解决方案,但它是迄今为止我发现的唯一一个。

我不确定为什么会这样,或者首先导致问题的原因,欢迎任何解释。

服务器发布 -

Meteor.publish("ddpPub", function () {

    var self  = this,
        ready = false;

    var userId = self.userId;

    var subHandle = TestData.find({}).observeChanges({
        added: function (id, fields) {
            if (ready) {
                console.log("ADDING PUBLICATION");
                self.changed("collectionTest", userId, {
                    type: "added",
                    data: {
                        id: id,
                        fields: fields
                    }
                });
            }
        },
        changed: function (id, fields) {
            if (ready) {
                console.log("CHANGING PUBLICATION");
                self.changed("collectionTest", userId, {
                    type: "changed",
                    data: {
                        id: id,
                        fields: fields
                    }
                });
            }
        },
        removed: function (id) {
            if (ready) {
                console.log("REMOVING PUBLICATION");
                ratePub(id, function (data) {
                    console.log("OBJECT DATA IS ", data);
                    self.changed("collectionTest", userId, data);
                });
            }
        }
    });

    self.added("collectionTest", userId);
    self.ready();
    ready = true;

    self.onStop(function () {
        subHandle.stop();
    });
});

var returnPub = function (id, callback) {
    console.log("RETURNING PUB ");
    callback({
        id: id,
        type: "removed",
        data: id
    });
};

var ratePub = _.rateLimit(returnPub, 10);

0 个答案:

没有答案