代码之家  ›  专栏  ›  技术社区  ›  SteAp

Pub/Sub是一个好的颤振模式吗?

  •  0
  • SteAp  · 技术社区  · 8 年前

    我刚开始学颤振。目前,我仍在为未来苦苦挣扎。

    因此,我打算写一篇 发布/订阅模式类 ,它应该是异步结果的中心消息代理。

    假设,某些方法需要来自HTTP通信的回复。

    它将使用我的callbackmethodcall订阅http_authorize_用户操作的结果,如下所示:

    broker.subscribe( HTTP_AUTHORIZE_USER, _callbackMethodCall );
    sharedHttpHelper.execute();
    

    另一方面,HTTP类会像这样发布其结果,其中调用者已将http_authorize_user作为mysubscriberchannel传递:

    broker.publish( mySubscriberChannel, actualResult );
    

    我知道,我可以用

    someFutureObject.then( <doSomething> );
    

    实际上,我觉得pub/sub更好地分离异步交互的两边。当把结果发回给不同的订阅者时,它更加灵活。

    你能解释一下为什么FutureObject.then()和它周围的自定义代码比pub/sub更好吗?

    可能还会提供一些示例代码,用futures/then()以更好的/标准的方式替换pub/sub代码?

    或者我最终可以用另一个异步模式替换一个异步模式,这样做可能什么也得不到?

    2 回复  |  直到 8 年前
        1
  •  2
  •   rmtmckenzie    8 年前

    我想从你的问题来看,你问了两件事:

    1. 应该使用Future/Async或回调
    2. 您应该有一个执行异步计算的中央类/中央类,或者在每个小部件的基础上执行它

    为了提出具体的建议,我想我需要更多的信息。不过,我可以给你一些一般性的建议。

    1:未来或回调

    在这种情况下,我会 高度地 建议花点时间了解DART中未来和异步方法的工作原理。你最终会遇到一些需要使用它们的东西,所以你最好现在就把它弄清楚。如果你真的搞不清楚,我建议你做一个现成的例子,把它贴到SO上,或者在一个飞镖/颤振通道上询问。

    也就是说,快速概述:

    在DART中,Future非常类似于JavaScript中的承诺(我看到您至少有一些使用JS的经验)。它们执行异步计算,然后在完成后调用传递到的任何回调 then .

    然而,在DART中也有 async 和 await 关键词。如果你标记一个方法 异步的 ,其签名必须指定将来的返回值。在函数中,如果您有任何调用的方法将返回一个未来,而不是执行 future.then(callback...) 你可以用 await future . 我相信JS在其最新的迭代中有类似的东西。

    从你的问题: someFutureObject.then( <doSomething> ); 会变成 var result = await someFutureObject; <dosomething>;

    如果你在颤振网站上看到,有更多更深入的解释。

    2:每个小部件的中心vs

    这更多地取决于你的具体情况。我要做的是把你的 asynchronous 交互是指a)应用程序每次运行一次,b)对全局状态有影响,或c)应用程序特定部分的本地交互。

    对于每次运行发生一次的事情,您可能只需在加载屏幕上执行一次(或者在启动仍处于启动状态时),例如从远程服务器加载常规设置。

    对于对全局状态有影响的内容(即登录和注销),我建议使用 InheritedWidgets 以及相应的statefulwidget。这样,您就可以简单地在较低的级别使用继承的小部件,并使用各种相关的属性,同时保证如果属性发生变化,小部件将重新生成。

    对于应用程序特定部分的本地内容,我建议使用 FutureBuilder 因为它有助于在加载时显示不同的小部件。

    就实际HTTP调用或其他调用的逻辑而言,最好是针对所使用的各种API创建特定的类。如果出于某种原因需要跟踪特定于HTTP调用的内容,可以使用singleton或注册表模式使API调用类能够保持状态。

    除非你有一个非常具体的原因,否则可能根本不需要一个酒吧/子系统;尽管如果你绝对觉得你需要使用一个,请看 eventbus plugin …

        2
  •  1
  •   boformer    8 年前

    您可以使用 Future 如果只等待一个结果,例如单个HTTP请求或从磁盘加载共享首选项。

    您可以使用 Stream 如果您有连续的事件或数据流。但是要小心,默认情况下,DART中的流没有启用多播,这意味着只能有一个订阅服务器,并且在取消订阅时流是关闭的。

    作为使用DART异步特性的回报,您可以获得许多语言特性( async/await )操作人员以及颤振部件( FutureBuilder / StreamBuilder )。

    另一种选择是 InheritedWidget S:这些实际上不是异步的,但是非常适合于全局状态(例如您的示例中的身份验证),这种状态不会经常更改。