node.js和一个在getInstance中具有asynchronous调用的单例

我已经实施了一个单例,遵循由Addy Osmani的书“学习Javascriptdevise模式”所描述的模型。

这个单身人士正在build立一个肥皂连接。 这是一个asynchronous调用,我想要在getInstance调用中执行,所以后续调用可以保证有完全连接的连接…

我以为我的想法是将callback传递给getInstance,在我的main.js函数中调用该调用,并在其他脚本需要连接时启动该调用。 和soap连接的其他每个消费者都将它传递给null。

这是一个黑客或一个很好的方法来做到这一点? 如果这不是一个标准的做法,你有什么build议?

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

但是最好使用Promise。 承诺的目的是善于处理asynchronous。 与callback相比,最显着的优势是Promise内置了error handling,进度和取消。

最stream行的框架和库包括Promise的实现。


小调:一个单例作为devise模式,更多的时候不是反模式 。 在使用时要特别耐心,特别是在可测性方面。 我不熟悉Addy Osmani的工作,所以我不能评论这个具体案例。

当你应用良好的dependency injection时,单例的概念将变得没有意义。

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

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

    1. 添加callbackgetInstance 。 如果对象已经被初始化,则在下一个勾号处调用callback函数。

    2. 在初始化完成之前排队所有请求。 这是超级方便,但也很复杂的实施。

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