2014-02-12 3 views
2

При использовании следующего кода на стороне клиента, почему переменная init в if(init) оценивается как true, даже если речь идет, прежде чем init = true и никакие новые документы не будут добавлены в Orders коллекции? Это приводит к тому, что query.observe возвращает все документы, возвращенные запросом, а не только новые.Meteor.startup на клиенте

Это поведение не наблюдается на стороне сервера, которое выполняет только console.log при добавлении новых документов.

Meteor.startup(function() { 

    var init = false 
    var query = Orders.find() 
    var handle = query.observe({ 
     added: function (doc) { 
      if(init) 
       console.log(doc) 
     } 
    }); 

    init = true 

}) 

ответ

3

Это происходит потому, что все синхронных на сервере тогда все асинхронных на клиенте.

init=true будет установлен после того, как операция query.observe закончена, но на клиенте он может быть установлен до этого, как init будет установлено true почти сразу же, как наблюдать ручку запуска.

Вам нужно будет использовать другое поведение, чтобы оно работало так, как вы ожидаете на клиенте.

Может использовать то, что получает метку времени после того, как подписка будет завершена, а затем только продолжать, если текущая временная метка выше:

Meteor.subscribe("yourdocs", function() { 
    Session.set("yourdocs_finishtime", new Date().getTime()); 
}); 

Тогда ваша добавленным ручка:

added: function (doc) { 
    var subtime = Session.get("yourdocs_finishtime"); 
    if(subtime && (subtime < new Date().getTime())) 
     console.log(doc); 
} 
Смежные вопросы