Метеоритная публикация this.ready не запускается

Я объединил две мои публикации в одну, так как они были очень похожи. Они оба вернули набор курсора. Я переписал их в низкоуровневом 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 не инициируются, что запрещает отображение содержимого. Кто-нибудь видит, что я здесь делаю не так?

Спасибо вам

РЕДАКТИРОВАТЬ:

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

1 ответ

Решение

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

Другие вопросы по тегам