node.js和在getInstance中具有异步调用的singleton
node.js and a singleton that has an asynchronous call in getInstance
我已经按照Addy Osmani的书《学习Javascript设计模式》中描述的模型实现了一个单例。
这个单例正在设置一个soap连接。这是一个异步调用,我想在getInstance调用中执行该调用,以便可以保证后续调用具有完全启动的连接。。。
我的一个想法是将回调传递给getInstance,在我的main.js函数中进行调用,当其他脚本需要连接时,它就会启动。以及soap连接的其他所有使用者,将其传递为null以进行回调。
这是破解还是一个好方法?如果这不是一种标准的方法,你有什么建议?
在处理事件时,如XMLHTTPRequest(无论是SOAP还是JSON),通常使用回调函数。
但是,最好使用Promises。承诺被设计成善于处理异步性。与回调相比,Promises最显著的优势是内置了错误处理、进度和取消功能
大多数流行的框架和库都包含Promises的实现。
需要注意的是:Singleton作为一种设计模式,通常是一种反模式。使用它时要感到非常疲惫,尤其是在可测试性面前。我不熟悉Addy Osmani的作品,所以我不能对这个具体的案例发表评论。
当应用良好的依赖注入时,Singleton的概念就变得毫无意义了。
有几种方法可以做到这一点:
-
让你成为
EventEmitter
。初始化完成时发出事件ready
或initilized
。问题:如果客户端在初始化singleton之后开始侦听,它将永远不会捕获initialized
事件。您可以添加initialized
属性,并在初始化完成时将其设置为true,以允许客户端检查对象状态。仍在使用它将需要对.initialized
属性进行静态检查,然后设置侦听器或立即继续。-
向
getInstance
添加回调。如果对象已经初始化,则在下一次勾选时调用回调。 -
在初始化完成之前对所有请求进行排队。它非常方便,但实现起来也很复杂。
-
顺便说一句,不要在node.js中使用getInstance
,它更像是java风格。只需要module.exports = new MyClass
就可以了。在这种情况下,2方法不适用,但你可以用一种特殊的方法来设置这样的回调,比如onReady()
。
- 如何使用异步调用更改工厂的变量
- 使变量可用于不带闭包的异步调用
- 需要收集Javascript nodejs异步调用
- 如何使用jQuery等待来自回调的异步调用
- 使用模态库从嵌套的异步调用中生成javascript同步代码
- 在forEach内部进行异步调用
- jQuery没有指定异步调用级别async:false
- SPA异步调用在IE 11中不起作用
- Ember.js-模型find()方法中的异步调用
- Javascript/JQuery处理并发/异步调用和数据竞争
- 在异步调用返回之前隐藏页面
- ExtJs 处理异步调用
- ES6:在异步调用中使用生成器
- Angular js - 异步调用 $scope.users 后不更新模态值
- 在每个循环上完成异步调用,然后转到下一个节点 js
- 从异步调用返回数组,然后为数组的每个元素返回其他异步调用
- 使用 AngularJS 的异步调用
- 循环内部的Javascript异步调用
- 使用Canvas和ForEach处理异步调用
- JavaScript/promise,对sharepoint的多个异步调用