【问题标题】:Meteor subscribe callbackMeteor 订阅回调
【发布时间】:2015-04-21 16:03:01
【问题描述】:

根据这里的这篇文章:

https://dweldon.silvrback.com/common-mistakes

订阅不会被阻止

框架的许多方面看起来都像魔术。如此之多以至于它可能 使您忘记网络浏览器的工作方式。举个简单的例子:

Meteor.subscribe('posts');

var post = Posts.findOne();

帖子将未定义的想法是大约一个的根本原因 在 stackoverflow 上的 20 个流星问题中。

那么为什么订阅没有回调,如果有,为什么流星文人不经常引用它?

为什么我们没有:

Meteor.subscribe('posts', function(err, posts){

//when the items/posts actually arrive

}); 

我希望我的问题有意义。

【问题讨论】:

    标签: meteor


    【解决方案1】:

    也许我没有明白这个问题,但 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

    【讨论】:

    • 如果您在没有回调的情况下调用并为变量分配了订阅,您可以使用ready() 方法检查订阅是否准备就绪。例如:var handle=Meteor.subscribe('posts') 在这里您可以使用handle.ready() 检查订阅是否准备就绪,这可能是meteor 文档不使用订阅回调的原因之一
    • 我想我的问题的意思是有太多的例子只显示 Meteor.subscribe 而没有回调,为什么你会在没有回调的情况下这样做。
    • 文档根本没有说明这一点,也没有给出示例。不幸的是,这令人困惑。
    • 这是假的。您正在向出版物发送 onReadyonError
    【解决方案2】:

    注意:我在阅读此问题后更新了文章。

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

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

    • 全局:客户端启动后立即启动,或者可能在自动运行中启动。

    • 路由:通过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 答案中,因为作者试图进行快速演示,而不是试图展示典型的使用模式。

    【讨论】:

    • 这完全有效。一个问题,你是在你的出版物中写了this.ready() 还是没有它的'handle.ready()' 工作?
    • 您不需要在发布函数中使用this.ready() 来在客户端上获取handle.ready()除非您在发布者中返回一个虚假值。例如,如果由于用户未登录而在发布函数中返回 undefined,则 handle.ready() 将永远不会在客户端上触发。另见this post
    • 我正在使用这种模式来响应 useEffect 钩子,它运行良好。该操作在更新全局 redux 状态的外部模块中调度。
    【解决方案3】:

    Meteor.subscribe 自 v1.2 以来已得到增强。在 Meteor v1.2.0.2 文档中,其中一个回调 onError 现在已替换为 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 话虽如此,下面的 sn-p 现在已弃用但不会破坏。

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

    【讨论】:

    • 我怎样才能得到订阅的结果?参数现在是空的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多