Meteor订阅回调

Ale*_*lls 25 meteor

根据这篇文章:

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回调.

来自docs.

例如.

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问题

  • 如果你在没有回调的情况下调用并为变量分配了一个订阅,你可以使用`ready()`方法检查订阅是否准备就绪.例如:`var handle = Meteor.subscribe('posts')`在这里你可以使用`handle.ready()来检查订阅是否准备好这可能是meteor docs不使用回调的原因之一订阅 (2认同)
  • 我想我的问题是,有太多的例子只是在没有回调的情况下显示Meteor.subscribe,为什么你会在没有回调的情况下做到这一点. (2认同)

Dav*_*don 20

注意:我在阅读完这篇问题后更新了这篇文章.

虽然subscribe确实有一个可选的回调,但我故意在原始文章中避免使用它,因为目前没有任何使用它的常见模式.换句话说,我不希望读者离开文章,认为回调实际上是解决这个问题的正确方法.

在生产应用程序中,订阅通常有两种形式:

  • 全局:一旦客户启动,或者可能在自动运行中启动.

  • 路线:通过a subscriptionswaitOn 选项启动.

值得注意的是,最近几周,模板订阅模式已经出现,但尚未广泛采用.

在所有这些情况下,订阅都会启动,然后可以异步检查是否处于被动ready状态,或者使用防护来忽略,以防止引用错误.

因为它ready是被动的,这有效地为我们提供了回调的相同好处,但代码行数较少.我们来看两个例子:

例1

Meteor.subscribe('posts', function() {
  Session.set('postsReady', true);
});

Tracker.autorun(function() {
  if (Session.get('postsReady'))
    showFancyAnimation();
});
Run Code Online (Sandbox Code Playgroud)

例2

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答案,因为作者试图快速演示而不是试图显示典型的使用模式.

  • 你不需要在发布函数中使用`this.ready()`来获取客户端__unless__上的`handle.ready()`你在发布者中返回一个假值.例如,如果在发布函数中返回`undefined`,因为用户没有登录,则`handle.ready()`永远不会在客户端上触发.另见[this post](https://forums.meteor.com/t/this-ready-in-a-publication/1681). (2认同)

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)

此处列出相关的Git承诺以供参考.