根据这篇文章:
https://dweldon.silvrback.com/common-mistakes
订阅不会阻止
框架的许多方面看起来都很神奇。这么多可能 导致您忘记Web浏览器的工作方式。举个简单的例子:
Meteor.subscribe('帖子&#39);
var post = Posts.findOne();
帖子未定义的想法是大致一个的根本原因 在stackoverflow上的二十个流星问题。
那么为什么没有订阅会有回调,如果确实如此,为什么Meteor文人更经常引用它呢?
为什么我们没有:
Meteor.subscribe('posts', function(err, posts){
//when the items/posts actually arrive
});
我希望我的问题有道理。
答案 0 :(得分:49)
也许我没有得到问题,但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 issue
答案 1 :(得分:20)
注意:我在阅读完这篇问题后对文章进行了更新。
虽然subscribe确实有可选回调,但我故意在原始文章中避免使用它,因为目前没有任何常用模式可以使用它。换句话说,我不希望读者离开文章,认为回调实际上是解决这个问题的正确方法。
在生产应用程序中,订阅通常有两种形式:
Global:客户启动后立即启动,或者自动运行。
路线:通过subscriptions
或waitOn
option启动。
值得注意的是,最近几周,template subscription pattern已经出现,但尚未广泛采用。
在所有这些情况下,订阅都会启动,然后可以异步检查被动ready
状态,或者使用guards忽略,以防止引用错误。
因为ready
是被动的,这有效地为我们提供了回调的相同好处,但代码行数较少。我们来看两个例子:
Meteor.subscribe('posts', function() {
Session.set('postsReady', true);
});
Tracker.autorun(function() {
if (Session.get('postsReady'))
showFancyAnimation();
});
var handle = Meteor.subscribe('posts');
Tracker.autorun(function() {
if (handle.ready())
showFancyAnimation();
});
两个示例都演示了相同的概念 - 订阅然后反应性地测试订阅的状态。正如您所看到的,回调确实没有任何好处。
最后,(正如我现在在文章中指出的那样),订阅通常在空间上与使用它们的代码分开。您通常会订阅路线代码并在模板中使用结果。因此,您几乎看不到看起来像的代码:
Meteor.subscribe('posts', function() {
showFancyAnimation();
});
事实上,我遇到过如上所述代码的唯一地方是SO答案,因为作者试图快速演示而不是试图显示典型的使用模式。
答案 2 :(得分:12)
Meteor.subscribe
已得到增强。其中一个回调onError
现在已在Meteor v1.2.0.2文档中替换为onStop
回调函数或对象
可选。可能包括onStop和onReady回调。如果有的话 错误,它作为参数传递给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
仍可用于向后兼容。 请注意,某些热门程序包(例如SubsManager)仍使用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承诺列在here以供参考。