首页 文章

pub/sub 是一个很好的扑动模式

提问于
浏览
0

我刚开始学习扑腾。目前,我仍然在与期货竞争。

因此,我打算写一个publish/subscribe 模式类,它应该是异步结果的中央消息代理。

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

它将使用我的_callbackMethodCall 订阅 HTTP_AUTHORIZE_USER 操作的结果,如下所示:

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

另一方面,http 类会像这样发布结果,调用者将 HTTP_AUTHORIZE_USER 作为 mySubscriberChannel 传递:

broker.publish( mySubscriberChannel, actualResult );

我知道,我可以使用

someFutureObject.then( <doSomething> );

实际上,我觉得 pub/sub 更好地解耦了异步交互的双方。将结果发布给不同的订阅者时更灵活。

你能解释一下,为什么 someFutureObject.then()和周围的自定义代码优于 pub/sub?

并且可能提供一些示例代码,以更好/标准的方式使用期货/ then()替换 pub/sub 代码?

或者我可以最终用另一个异步模式替换异步模式,并且可能通过这样做赢得任何东西?

2 回答

  • 2

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

    • 你应该使用 Future/Async 还是回调

    • 你应该有一个中央类/中心类来执行异步计算或在 per-widget 基础上执行

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

    1:未来或回调

    在这种情况下,我强烈建议花时间了解 Dart 中的期货和异步方法是如何工作的。你最终会遇到需要使用它们的东西,所以你现在也可以把它弄清楚。如果你真的无法弄清楚,我建议制作一个罐装示例并将其发布到 SO 或询问其中一个 dart/flutter 频道。

    话虽如此,快速概述:

    在 dart 中,Future 与 Javascript 中的 Promises 非常相似(我看到你至少有一些 JS 的经验)。它们执行异步计算,然后当它们完成时,它们会调用您传递给then的任何回调。

    但是,在飞镖中还有asyncawait关键字。如果标记方法async,则其签名必须指定 Future 的返回值。在函数中,如果你有任何调用的方法将返回 Future,而不是future.then(callback...),你可以使用await future。我相信 JS 在其最新的迭代中有类似的东西。

    从您的问题:someFutureObject.then( <doSomething> );将成为var result = await someFutureObject; <dosomething>;

    如果你在 flutter 网站上看到更多的 in-depth 解释。

    2:Central vs Per-Widget

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

    对于每次运行一次发生的事情,你可以通过加载屏幕(或者在启动时仍然运行时)简单地执行一次 - 例如,可以从远程服务器加载常规设置。

    对于对全局状态有影响的事情(i.e.登录和退出),我建议使用InheritedWidgets和相应的 StatefulWidget。这样,您可以简单地在较低级别使用继承的窗口小部件并使用各种相关属性,并确保在窗口属性发生更改时窗口小部件将重建。

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

    在进行实际 http 调用或其他任何操作的逻辑方面,您可能最好不要使用特定于您使用的各种 API 的类。如果有某些原因需要跟踪特定于 http 调用的内容,可以使用 Singleton 或 Registry 模式使您的 API 调用类能够保持状态。

    除非你有一个非常具体的原因,否则可能根本不需要 pub/sub 系统;虽然如果你绝对觉得需要使用一个,请看eventbus 插件...

  • 1

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

    如果您有连续的事件或数据流,则可以使用Stream。但要小心,默认情况下,Dart 中的流不是 multicast-enabled,这意味着只能有一个订阅者,并且在取消订阅时关闭流。

    作为使用 dart 的异步功能的回报,您将获得许多语言功能(async/await)和运算符以及 Flutter 小部件(FutureBuilder/StreamBuilder)。

    另一个替代方案是InheritedWidget s:它们实际上不是异步的,但非常适合全局状态(如示例中的身份验证),它不会经常更改。

相关问题