2016-03-13 4 views
0

Я использую метеорит для отслеживания прогресса человека по мере продвижения по викторине. Я хочу вернуть случайный вопрос из викторин, который соответствует текущему вопросу. Моя проблема в том, что у меня есть два метода: один создает документ, чтобы отслеживать их прогресс через весь викторину, а другой создает документ для отслеживания конкретного вопроса, а также документов, соответствующих ответам. Мне нужно, чтобы «questionId» устанавливался в одном вызове метода, равном «currentQuestionId» в другом.Синхронизация данных по коллекциям в метеоре

Проблема заключается в том, что при попытке синхронизации текущего запроса в моем ответеToLectures с вопросом, который он фактически выбирает, не совсем работает в моем текущем коде, потому что методы асинхронны, но я вызываю их синхронно. Могу ли я получить помощь в том, как реорганизовать этот код на более метеорный? Самое забавное, что я замечаю, что если я поставлю console.logs во внутреннем блоке «if», я увижу, что они вызываются> 5 раз до загрузки страницы, я предполагаю, что я ожидаю, что как только он вернется, что он перестанет запускать блок, и в следующий раз, когда он загрузится, он сразу вернет правильный вопрос. Благодаря!

Question: function(){ 
     var responsesToLectures = ResponsesToLectures.findOne({}); 
     if (responsesToLectures != null){ 
      if(responsesToLectures.currentProblemId == null){ 
       var questionCount = Questions.find({level: responsesToLectures.currentLevel}).count(); 
       if(questionCount != null){ 
        var randomNumber = Math.floor((Math.random() * questionCount)); 
        var randomQuestion = Questions.findOne({level: responsesToLectures.currentLevel}, {skip: randomNumber}); 
        if (randomQuestion != null) { 
         Meteor.call('setRandomQuestion', randomQuestion._id, randomQuestion.lectureId); 
         return randomQuestion; 
        } 
       } 
      } else { 
       return Questions.findOne({_id : responsesToLectures.currentProblemId}); 
      } 
     } 
    }, 

Вопрос заключается в том, что Question.findOne, который получает вернулся из этого другого идентификатора от того, который я поставил, используя «» setRandom вопрос. Каков правильный способ извлечения ценностей из документов в коллекциях, чтобы я мог передавать их в документы из других коллекций?

Это Монго дб, чтобы показать вам, что я имею в виду:

meteor:PRIMARY> db.responses.find(); 
{ "_id" : "zTTF7GrnuRqT4JNck", "userId" : "hneHgetL9oYaL2iWA", "questionId" : "ZSYJXn59ykA9QrTv6", "answerId" : "yHQzekpge486CwqLJ" } 
{ "_id" : "47d2hhw7okLq2SXhm", "userId" : "hneHgetL9oYaL2iWA", "questionId" : "ZSYJXn59ykA9QrTv6", "answerId" : "WyyKfxzbinjxgrujd"} 
{ "_id" : "ZqQu3TDcdMeo2SFBR", "userId" : "hneHgetL9oYaL2iWA", "questionId" : "ZSYJXn59ykA9QrTv6", "answerId" : "MES2Aj8PTNzMmthyh"} 
{ "_id" : "dHtyKSxDccXvBTjnD", "userId" : "hneHgetL9oYaL2iWA", "questionId" : "ZSYJXn59ykA9QrTv6", "answerId" : "tPcCSjS8qhL7oebWZ" } 
meteor:PRIMARY> db.responsesToLectures.find(); 
{ "_id" : "TohrY5tHK2DJ2ngWb", "userId" : "hneHgetL9oYaL2iWA", "lectureId" : "pZKuD2LnBh73wPTtN", "currentLevel" : 1, "currentQuestionId" : "FZBQu5wQq2bA2e6SB" } 
meteor:PRIMARY> db.scores.find(); 
{ "_id" : "9HhC8CBG4JJTxcR8m", "userId" : "hneHgetL9oYaL2iWA", "questionId" : "ZSYJXn59ykA9QrTv6" } 
+2

Вы хотите изучить использование крючков для коллекции. –

+0

Спасибо! Если я использую autoform на другой части сайта, я должен быть обеспокоен тем, что эти крючки коллекции будут вызваны тогда? – Coherent

+0

Да, вам нужно это учитывать. –

ответ

0

Для тех, кто сталкивается с такого рода вопроса в будущем, я был в состоянии использовать крючки сбора для синхронизации идентификаторов в нескольких семействах. Это сработало для меня!

ResponsesToLectures.before.insert(function(userId, doc){ 
    var questionCount = Questions.find({level: doc.currentLevel}).count(); 
    if(questionCount != null){ 
     var randomNumber = Math.floor((Math.random() * questionCount)); 
     var randomQuestion = Questions.findOne({level: doc.currentLevel}, {skip: randomNumber}); 
     if (randomQuestion != null) { 
      doc.currentQuestionId = randomQuestion._id; 
     } 
    } 
}); 
Смежные вопросы