根据这篇文章:
https://dweldon.silvrback.com/common-mistakes
订阅不会阻止
框架的许多方面看起来都很神奇.这么多,以至于它可能会让你忘记Web浏览器的工作方式.举个简单的例子:
Meteor.subscribe( '信息');
var post = Posts.findOne();
帖子未定义的想法是stackoverflow上大约二十个流星问题的根本原因.
那么为什么不订阅有回调,如果有,为什么Meteor文人更经常引用它呢?
为什么我们没有:
Meteor.subscribe('posts', function(err, posts){
//when the items/posts actually arrive
});
Run Code Online (Sandbox Code Playgroud)
我希望我的问题有道理.
Eth*_*aan 50
也许我没有得到问题,但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); }
});
Run Code Online (Sandbox Code Playgroud)
另请检查此GitHub问题
Dav*_*don 20
注意:我在阅读完这篇问题后更新了这篇文章.
虽然subscribe确实有一个可选的回调,但我故意在原始文章中避免使用它,因为目前没有任何使用它的常见模式.换句话说,我不希望读者离开文章,认为回调实际上是解决这个问题的正确方法.
在生产应用程序中,订阅通常有两种形式:
全局:一旦客户启动,或者可能在自动运行中启动.
路线:通过a subscriptions或waitOn 选项启动.
值得注意的是,最近几周,模板订阅模式已经出现,但尚未广泛采用.
在所有这些情况下,订阅都会启动,然后可以异步检查是否处于被动ready状态,或者使用防护来忽略,以防止引用错误.
因为它ready是被动的,这有效地为我们提供了回调的相同好处,但代码行数较少.我们来看两个例子:
Meteor.subscribe('posts', function() {
Session.set('postsReady', true);
});
Tracker.autorun(function() {
if (Session.get('postsReady'))
showFancyAnimation();
});
Run Code Online (Sandbox Code Playgroud)
var handle = Meteor.subscribe('posts');
Tracker.autorun(function() {
if (handle.ready())
showFancyAnimation();
});
Run Code Online (Sandbox Code Playgroud)
这两个示例都演示了相同的概念 - 订阅然后反应性地测试订阅的状态.正如您所看到的,回调确实没有任何好处.
最后,(正如我现在在文章中指出的那样),订阅通常在空间上与使用它们的代码分开.您通常会订阅路线代码并在模板中使用结果.因此,您几乎看不到看起来像的代码:
Meteor.subscribe('posts', function() {
showFancyAnimation();
});
Run Code Online (Sandbox Code Playgroud)
事实上,我遇到过如上所述代码的唯一地方是SO答案,因为作者试图快速演示而不是试图显示典型的使用模式.
Sea*_*son 12
Meteor.subscribe自v1.2以来一直在增强.其中一个回调onError现在已onStop在Meteor v1.2.0.2文档中替换
回调函数或对象
可选的.可能包括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
}
});
Run Code Online (Sandbox Code Playgroud)
但是,onError仍然可以向后兼容.请注意,一些流行的软件包,如SubsManager仍然使用onError.据说下面这样的片段现在已被弃用但不会破坏.
Meteor.subscribe( 'collection', {
onError: function( error ) {
// if the subscribe terminates with an error
},
onReady: function() {
// when ready
}
});
Run Code Online (Sandbox Code Playgroud)
另一方面,Meteor.subscribe可以像以前一样将回调用作函数
Meteor.subscribe( 'collection', function() {
// when ready
});
Run Code Online (Sandbox Code Playgroud)
正如我个人的注意,如果Meteor.subscribe恰好通过粗心的多个回调函数传递,只有最后一个作为onReady回调生效.
Meteor.subscribe( 'collection', function() {
// this doesn't execute.
}, function() {
// when ready.
});
Run Code Online (Sandbox Code Playgroud)