Метеоритная публикация 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 решило проблему.