2015-07-12 2 views
1

Я вставляю много документов в методе в Метеор. Могу ли я приостановить подписки до тех пор, пока этот метод не будет завершен?Пауза/остановка публикации/подписки при вставке в Метеор

Я использую https://github.com/mikowals/batch-insert для вставки нескольких документов, и он отлично работает, но на сервере заканчивается память при попытке опубликовать все документы во время вставки.

ответ

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

Ключевая идея заключается в том, что reactiveVarTrueIfBatchInsert является reactive variable, что истинно, если и только если вы в настоящее время партия вставки. ПРИМЕЧАНИЕ: использование обертки с Meteor.defer имеет важное значение, так как без нее реактивная переменная не успеет повлиять на подписку перед вызовом метода.

Смежные вопросы