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时,单例的概念将变得没有意义。
有几种方法可以做到这一点:
-
让你单身一个
EventEmitter
。 在初始化完成时发送事件ready
或初始化。 问题:如果客户端在单例初始化之后开始监听,它将永远不会捕获initialized
事件。 您可以添加initialized
属性,并在初始化完成时将其设置为true,以允许客户端检查对象状态。 仍然使用它将需要静态检查.initialized
属性,然后设置监听器或立即进行。-
添加callback
getInstance
。 如果对象已经被初始化,则在下一个勾号处调用callback函数。 -
在初始化完成之前排队所有请求。 这是超级方便,但也很复杂的实施。
-
顺便说一下,不要在node.js中使用getInstance
,它更像java风格。 只是module.exports = new MyClass
会做。 在这种情况下,2方法是不适用的,但你可以添加一个特殊的方法来设置这样的callback,如onReady()
。
- 如何在NodeJs中使用asynchronous数据源创build可读stream?
- Apidevise为一个不安全的asynchronous函数
- pipe理node-postgres查询
- 如何处理客户端nodejs的asynchronous请求?
- 我怎么能promisify我写的一个简单的asynchronous函数?
- asynchronous数据库使用recursion调用
- 如果将文件可写入stream传递给Node.js中的Console构造函数,是否正在向其写入asynchronous?
- Node.js:在继续之前等待循环中的callback
- 当它已经被asynchronous地从别的地方改变时,防止改变数组?