Метеор подписывает обратный вызов
В соответствии с этой статьей здесь:
https://dweldon.silvrback.com/common-mistakes
Подписки не блокируют
Многие аспекты структуры выглядят как магия. Настолько, что это может забудьте забыть, как работают веб-браузеры. Возьмем этот простой пример:
Meteor.subscribe( 'сообщения');
var post = Posts.findOne();
Идея, что сообщение будет undefined, является основной причиной примерно одного в двадцати метеорных вопросах о stackoverflow.
Итак, почему не подписаться, есть обратный вызов, и если да, то почему он не ссылается чаще всего на литераторов Meteor?
Почему у нас нет:
Meteor.subscribe('posts', function(err, posts){
//when the items/posts actually arrive
});
Надеюсь, мой вопрос имеет смысл.
Ответы
Ответ 1
Возможно, у меня нет вопроса, но функция Meteor.Subscribe имеет обратные вызовы с именами методов onError и onReady.
Дополнительно. Может включать onError и onReady обратные вызовы. Если функция вместо объекта, он интерпретируется как обратный вызов onReady.
Из документов.
Например.
Meteor.subscribe("posts", {
onReady: function () { console.log("onReady And the Items actually Arrive", arguments); },
onError: function () { console.log("onError", arguments); }
});
Также проверьте эту проблему GitHub
Ответ 2
Примечание. Я прочитал статью после прочтения этого вопроса.
В то время как subscribe имеет необязательный обратный вызов, я намеренно избегал его в оригинальной статье, потому что в настоящее время нет общих шаблонов, которые его используют. Другими словами, я не хотел, чтобы читатели уходили от статьи, думая, что обратные вызовы на самом деле являются правильным решением этой проблемы.
В производственных приложениях подписки обычно бывают двух вариантов:
-
Global: инициируется сразу же после запуска клиента или, возможно, автозапуска.
-
Маршрут: инициируется как через опцию subscriptions
или waitOn
.
Также стоит отметить, что в последние недели появился шаблон подписки шаблона , хотя он еще не получил широкого распространения.
Во всех этих случаях подписка запускается, а затем может быть либо асинхронно проверена для реактивного состояния ready
, либо проигнорирована с использованием guards, чтобы избежать ошибок.
Поскольку ready
является реактивным, это дает нам те же преимущества обратного вызова, но с меньшим количеством строк кода. Рассмотрим два примера:
пример 1
Meteor.subscribe('posts', function() {
Session.set('postsReady', true);
});
Tracker.autorun(function() {
if (Session.get('postsReady'))
showFancyAnimation();
});
пример 2
var handle = Meteor.subscribe('posts');
Tracker.autorun(function() {
if (handle.ready())
showFancyAnimation();
});
Оба примера демонстрируют ту же концепцию - подписку и затем реактивное тестирование состояния подписки. Как вы можете видеть, на самом деле нет никакой выгоды для обратного вызова.
Наконец, (как я уже указывал в статье), подписки часто пространственно отделены от кода, который их использует. Вы обычно подписываетесь в своем коде маршрута и потребляете результаты в своих шаблонах. По этой причине вы почти никогда не видите код, который выглядит следующим образом:
Meteor.subscribe('posts', function() {
showFancyAnimation();
});
Фактически, единственное место, где я когда-либо сталкивался с кодом, подобным выше, - это ответы SO, потому что автор пытается сделать быструю демонстрацию, а не пытается показать типичный шаблон использования.
Ответ 3
Meteor.subscribe
был улучшен с версии 2.1. Один из его обратных вызовов onError
теперь заменен на onStop
в документации Meteor v1.2.0.2
обратные вызовы Функция или объект
Дополнительно. Может включать onStop и onReady обратные вызовы. Если есть error, он передается как аргумент onStop. Если функция передана вместо объекта, он интерпретируется как обратный вызов onReady.
Имея это усовершенствование, Meteor.subscribe
используется с обратными вызовами как объект
Meteor.subscribe( 'collection', {
onStop: function( error /* optional */ ) {
// when the sub terminates for any reason,
// with an error argument if an error triggered the stop
},
onReady: function() {
// when ready
}
});
Однако onError
все еще работает для обратной совместимости. При этом такой сниппет теперь ниже, но не прерывается.
Meteor.subscribe( 'collection', {
onError: function( error ) {
// if the subscribe terminates with an error
},
onReady: function() {
// when ready
}
});
С другой стороны, Meteor.subscribe
может использоваться с обратным вызовом как функция, как раньше
Meteor.subscribe( 'collection', function() {
// when ready
});
Как мое личное уведомление, если Meteor.subscribe
передается с неосторожными многочисленными функциями обратного вызова, только последний действует как обратный вызов onReady
.
Meteor.subscribe( 'collection', function() {
// this doesn't execute.
}, function() {
// when ready.
});
Соответствующее обязательство Git указано здесь для справки.