我正在升级一个看起来像这样的库(为了简洁,在coffeescript中):
//machine.coffee
exports.Machine = class Machine
constructor: (config) ->
/** initialize Machine with config data **/
getSomething: (callback) ->
/** do something that depends on config **/
callback null, something
并且像您所期望的那样使用:
machine = require 'machine'
config = {knob: "tweak", switch: "fiddle" }
myMachine = machine.createMachine config
myMachine.getSomething (err, something) ->
/** we now have something **/
但是,现在配置依赖于我必须从另一个站点请求的设置,因此它看起来更像这样,并且 Machine 已更新为解析和使用来自外部源的数据。因此,像这样访问 Machine 是可行的:
config = {knob: "tweak", switch: 'http://returns/switch/data' }
/**methods now must wait until Machine is initialized with remote config data **/
machine.createMachine config, (err, machine) ->
machine.getSomething (err, something) ->
/** we now have something **/
但问题是这打破了原来的用法:
myMachine = machine.createMachine config
/** remote calls to config not completed yet **/
myMachine.getSomething (err, something) ->
/** we don't have something because Machine is still initializing **/
我的问题:是否有办法保留原始用例? 一种方法可能是将未初始化的类的方法调用排队,直到其完全初始化,但我不确定如何开始这样做。有没有办法对方法进行排队?或者是否有其他更好的方法可以允许具有原始用法的遗留代码仍然有效?
澄清: 我无法控制初始配置数据,也无法控制随后在机器上调用的时间或方法。不过,我确实有能力以任何必要的方式修改机器。
最佳答案
我认为您不应该再公开 Machine
构造函数。相反,您应该公开一个异步工厂函数:
class Machine # not exported
# ...
exports.createMachine = (config, cb) ->
getConfig(config, (err, configData) ->
if err return cb(err)
cb(new Machine(configData))
)
关于javascript - Node.js:当对象未完成初始化时调用方法的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9131651/