Meteor订阅回调

时间:2015-02-20 03:22:03

标签: meteor

根据这篇文章:

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

}); 

我希望我的问题有道理。

3 个答案:

答案 0 :(得分:49)

也许我没有得到问题,但Meteor.Subscribe函数的回调名为onError和onReady方法。

  

可选。可能包含onError和onReady回调。如果是一个功能   传递而不是对象,它被解释为onReady回调。

From docs.

例如。

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:客户启动后立即启动,或者自动运行。

  • 路线:通过subscriptionswaitOn option启动。

值得注意的是,最近几周,template subscription pattern已经出现,但尚未广泛采用。

在所有这些情况下,订阅都会启动,然后可以异步检查被动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答案,因为作者试图快速演示而不是试图显示典型的使用模式。

答案 2 :(得分:12)

自v1.2起,

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以供参考。