2016-03-13 5 views
0

Кроме того, следующие функции, которые возвращают объект с методом в остановки, если вызываются из расчета реактивного, останавливаются, когда вычисления будет выполнены заново или остановлен:Функции остановки-остановки все еще останавливаются, когда внутри вложенных функций?

Tracker.autorun (вложенный) Meteor. подписаться наблюдать() и observeChanges() на курсоров

Это означает, что наблюдать останавливается здесь:

Tracker.autorun -> 
    cursor.observe() 

Но как насчет здесь?

Tracker.autorun -> 
    Tracker.nonReactive -> 
    cursor.observe() 
+0

Это не только вложенная функция, это 'nonreactive' контекст, поэтому наблюдение в нем не будет автоматически остановлен. – MasterAM

ответ

2

Когда MiniMongo реактивная рукоятка (find(), observe() и т.д.) создается в реактивном вычисления, MiniMongo обнаружит его и прикрепить слушателя к вычислению-х onInvalidate, что остановит ручку, когда вычисление аннулируется (или остановился).

Это не имеет значения, является ли это делается непосредственно в autorun обратного вызова или в функции, которая вызывается из обратного вызова его, до тех пор, как это делается синхронно (т.е., в то время как в контексте одного и того же расчета).

Есть одно заметное исключение: нереактивный обратный вызов.

Tracker.nonreactive обратного вызова вызывается в нереакционноспособном контексте, поэтому current computation установлен в null и Tracker.active установлен в false. В этих условиях MiniMongowill not attach the aforementioned listener, и наблюдатель изменений не будет остановлен автоматически.

Вы можете остановить его вручную, хотя:

const MyCollection = new Mongo.Collection(null); 
const cursor1 = MyCollection.find({foo: 'bar'}); 
const cursor2 = MyCollection.find({foo: 'baz'}); 

let observeCallback = { 
    added(doc) { 
    console.log('added', doc); 
    } 
}; 


let handle = Tracker.autorun(function(c) { // c is the computation object 
    cursor1.observe(observeCallback); // will be automatically stopped 

    Tracker.nonreactive(function() { 
    let observer = cursor2.observe(observeCallback); 
    c.onStop(function() { 
     observer.stop(); // explicitly stops the observer 
    }) 

    }); 

}); 

MyCollection.insert({foo: 'bar'}); 
MyCollection.insert({foo: 'baz'}); 

handle.stop();