node.js和在getInstance中具有异步调用的singleton

node.js and a singleton that has an asynchronous call in getInstance

本文关键字:异步 调用 singleton js 和在 getInstance node      更新时间:2023-09-26

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

这个单例正在设置一个soap连接。这是一个异步调用,我想在getInstance调用中执行该调用,以便可以保证后续调用具有完全启动的连接。。。

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

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

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

但是,最好使用Promises。承诺被设计成善于处理异步性。与回调相比,Promises最显著的优势是内置了错误处理、进度和取消功能

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


需要注意的是:Singleton作为一种设计模式,通常是一种反模式。使用它时要感到非常疲惫,尤其是在可测试性面前。我不熟悉Addy Osmani的作品,所以我不能对这个具体的案例发表评论。

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

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

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

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

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

顺便说一句,不要在node.js中使用getInstance,它更像是java风格。只需要module.exports = new MyClass就可以了。在这种情况下,2方法不适用,但你可以用一种特殊的方法来设置这样的回调,比如onReady()