在Meteor中插入时暂停/停止发布/订阅

时间:2015-07-12 12:56:07

标签: meteor

我在Meteor中的方法中插入了许多文档。在此方法完成之前,我可以暂停订阅吗?

我使用https://github.com/mikowals/batch-insert插入多个文档但它工作正常但是在插入时尝试发布所有文档时服务器内存不足。

1 个答案:

答案 0 :(得分:0)

首先,我想您应该重新考虑是否要发布那么多文档:它们都被转移到每个客户端并导致大量流量。此外,我怀疑如果你“暂停”发布服务器将不会耗尽内存。

如果您确实需要,可以使用一种简单的方法暂停发布:将订阅中的布尔参数传递给您的发布,并在客户端操作触发批量插入时使订阅反应性地重新运行。听起来很复杂,很容易:

// on the client
Tracker.autorun(function() {
    // reactively depend on event causing batch insert
    var doPublish = reactiveVarTrueIfBatchInsert.get();
    Meteor.subscribe('myPub', doPublish, function() { // ... });
});
...
// inside some event
reactiveVarTrueIfBatchInsert.set(true);
Meteor.defer(function() {
    Meteor.call('batchInsertMethod', function() {
        reactiveVarTrueIfBatchInsert.set(false);
    });
});

// on the server
Meteor.publish('myPub', function() {
    var doPublish = arguments[0];
    var result = [];
    if(doPublish) result = myDocs.find({});
    return result;
});

关键的想法是reactiveVarTrueIfBatchInsertreactive variable,当且仅当您当前是批量插入时才是真的。 注意:使用带有Meteor.defer的包装器是必不可少的,因为没有它,反应变量在方法调用之前没有时间影响订阅。