2016-05-10 2 views
0

Я объединил две мои публикации в одну, так как они были очень похожи. Оба они вернули набор курсоров. Я переписал их в API низкого уровня, чтобы сделать некоторый контроль над удалением данных.Публикация этого метеорита уже не запускается

Моя проблема в том, что по какой-то причине я полностью игнорирую, обратный вызов подписки onReady никогда не срабатывает. У меня есть другой низкоуровневый pubsub в моем приложении, который публикует данные аналогичным образом и работает отлично.

На сервере отображаются все мои журналы, и никаких ошибок не отображается. Публикация выполняется правильно, и данные эффективно отправляются клиенту. На клиенте не запускается обратный вызов onReady или onError.

публикации:

Meteor.publish("getTalkthread", function (thread_id) { 
    unblock(this); 

    console.log("start"); 

    let uids = tags = corrections = [], 
      self = this; 

    let posts_cursor = Modules.both.queryGet({ 
       type    : 'posts', 
       method   : 'find', 
       query    : { $or: [ 
          { _id: thread_id }, 
          { parent: thread_id } 
          ] 
         }, 
       projection : { sort : { _id: 1 }, 
               limit : 50 
              } 
      }); 

    let posts_array = posts_cursor.fetch(), 
     posts_ids = posts_array.map(e => (e._id)); 

    //console.log("fetched posts", posts_array); 

    let corrs_cursor = Modules.both.queryGet({ 
       type    : 'corrections', 
       method   : 'find', 
       query    : { talkId: { $in: posts_ids } }, 
       projection : { sort : { _id: 1 }, 
               limit : 50 
              } 
      }); 

    let corrs_array = corrs_cursor.fetch(); 

    //console.log("fetched corrs", corrs_array); 

    let posts_authors = posts_array.map(e => (e.owner)), 
     corrs_authors = corrs_array.map(e => (e.owner)); 

    let users_ids = _.union(posts_authors, corrs_authors); 

    let users_cursor = Modules.both.queryGet({ 
      type    : 'users', 
      method   : 'find', 
      query    : { _id: { $in: users_ids } }, 
      projection : { sort  : { date: -1 }, 
          limit  : 100, 
          fields : USER_PROFILE_FIELDS_ 
         } 
     }); 

    //console.log("fetched users", users_cursor.fetch()); 

    let observers = {}; 

    observers.posts = posts_cursor.observeChanges({ 
     added  : (id, fields) => { console.log("post added " + id); self.added ("posts", id, fields); }, 
     changed : (id, fields) => { console.log("post changed " + id); self.changed("posts", id, fields); }, 
     removed : (id)     => { 
      console.log("test"); 
     if (id != thread_id) { 
       console.log(true); 
     self.removed("posts removed " + id); 
     } 
    } 
    }); 

    observers.users = users_cursor.observeChanges({ 
     added  : (id, fields) => { console.log("user added " + id); self.added ("users", id, fields); }, 
     changed : (id, fields) => { console.log("user changed " + id); }, 
     removed : (id)     => { console.log("user removed " + id); } 
    }); 

    observers.corrs = corrs_cursor.observeChanges({ 
     added  : (id, fields) => { console.log("corr added " + id); self.added ("corrections", id, fields); }, 
     changed : (id, fields) => { console.log("corr changed " + id); self.changed("corrections", id, fields); }, 
     removed : (id)     => { console.log("corr removed " + id); self.removed("corrections", id);    } 
    }); 

    console.log("observers created"); 

    this.ready(); 

    self.onStop(() => { 
     observers.posts.stop(); 
     observers.users.stop(); 
     observers.corrs.stop(); 
    }); 

    console.log("end"); 

}); 

Подписка:

 console.log("sub"); 
     self.subscribe("getTalkthread", id, self.rerun.get()), { 
     onReady: function() { 
      console.log("READY"); 
      if (!Posts.findOne({ _id: id })) { 
      $("#404NotFound").show(); 
      $("#isoContent").hide(); 
      } else if (Posts.findOne(id)) { 
      $("#isoContent").show(); 
      } 
      $("#spin").hide(); 
     }, 
     onError: function() { 
      console.log("ERROR"); 
      $("#spin").hide(); 
      $("#404NotFound").show(); 
      $("#isoContent").hide(); 
     } 
     }; 

страница клиента отображается правильно, но манипуляции DOM не срабатывает, запрещая отображение содержимого. Кто-нибудь видит, что я делаю неправильно здесь?

Спасибо Вам

EDIT:

Я пытался вернуть массив из трех движков, и, по какой-либо причине, проблема та же. Однако я не понимаю, почему.

+0

не уверен, что это за разблокировать (это); Есть пакеты, которые позволяют вам делать 'this.unblock()' в публикациях, если это то, что вы имели в виду. –

+0

не уверен, в чем проблема. я проверил бы с пустой публикацией, которая просто называлась 'this.ready', и посмотрел, будет ли вызван ваш callback на клиенте. затем медленно создайте публикацию. –

+0

Именование переменных с подчеркиваниями вредит моим глазам. Используйте camelCase в JS. Это не Python –

ответ

0

Хотя я не понимаю, почему, используя SubManager от Arunoda вместо родной Meteor.subscribe, разрешена проблема.