【问题标题】:node.js and a singleton that has an asynchronous call in getInstancenode.js 和一个在 getInstance 中有异步调用的单例
【发布时间】:2013-11-19 17:20:56
【问题描述】:

我按照 Addy Osmani 的书“学习 Javascript 设计模式”中描述的模型实现了一个单例。

这个单身人士正在建立一个肥皂连接。这是一个异步调用,我想在 getInstance 调用中执行它,这样可以保证后续调用具有完全建立的连接...

我的一个想法是向 getInstance 传递一个回调,在我的 main.js 函数中进行调用,当其他脚本需要连接时,它就会启动。以及所有其他soap 连接的消费者,将其传递给回调null。

这是一个 hack 还是一个好方法? 如果这是一种不标准的做法,你有什么建议?

【问题讨论】:

标签: javascript node.js soap asynchronous


【解决方案1】:

在处理事件时,例如 XMLHTTPRequest(无论是 SOAP 还是 JSON),通常使用回调函数。

但是,最好使用 Promises。 Promise 被设计为擅长处理异步性。与回调相比最显着的优势是 Promise 内置了错误处理、进度和取消。

大多数流行的框架和库都包含 Promises 的实现。


一个小提示:作为一种设计模式的单例,通常不是反模式。使用它时要非常疲倦,尤其是在可测试性面前。我不熟悉 Addy Osmani 的工作,所以我无法评论这个具体案例。

当您应用良好的依赖注入时,Singleton 的概念就变得没有意义了。

【讨论】:

  • Promise 与模块化无关
  • 您希望所有函数都有 4 个额外的回调参数(完成、失败、总是、取消)?请详细说明。
  • 是否有4个参数或4个接受回调的方法根本不是模块化的问题,也许是可读性。 I have written a lot about promises, like why one should use them. 为反模式 +1。
  • 我知道这是一篇旧文章......但是...... Singleton 是一种经过验证且有效的设计模式,而不是反模式!如果您在测试中不采用强大的设计,单例会咬到您吗?是的,但那是由于测试设计不佳,而不是因为单例模式有问题。依赖注入和单例是相互排斥的东西。依赖注入绝不会消除单例的必要性,在使用依赖注入时使用单例是很常见的。
  • 另外,你需要小心地说出诸如“但是最好使用 Promises”之类的话。使用 Promise 时可能会发生显着的性能下降,尤其是 Q。像 bluebird 这样的库已经大大提高了性能(节点中的生成器应该使这个评论过时),但是回调,虽然可能很难处理,但仍然被证明是快速的!
【解决方案2】:

有几种方法可以做到这一点:

  1. 让你单身成为EventEmitter。初始化完成时发出事件readyinitilized。问题:如果客户端在单例初始化后开始监听,它永远不会捕获initialized 事件。您可以添加initialized 属性并在初始化完成时将其设置为true,以允许客户端检查对象状态。仍然使用它需要对.initialized 属性进行静态检查,然后设置侦听器或立即继续。

    1. 添加回调到getInstance。如果对象已初始化,则在下一次滴答时调用回调。

    2. 在初始化完成之前对所有请求进行排队。它超级方便,但实施起来也很复杂。

顺便说一句,不要在node.js中使用getInstance,它更像是java-style。只需module.exports = new MyClass 即可。在这种情况下,方法 2 不适用,但您可以添加一种特殊方法来设置此类回调,例如 onReady()

【讨论】:

  • 事件发射器在处理流程方面非常出色,即使应用程序涉及大量算法流程
猜你喜欢
  • 2015-11-04
  • 1970-01-01
  • 2023-04-04
  • 2014-12-18
  • 2019-01-20
  • 2018-01-04
  • 2013-08-03
  • 2017-03-10
  • 2017-09-17
相关资源
最近更新 更多