javascript - Node.js:当对象未完成初始化时调用方法的解决方法?

标签 javascript node.js coffeescript

我正在升级一个看起来像这样的库(为了简洁,在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/

相关文章:

javascript - 在莫里斯图表中正确显示 JSON 结果

javascript - 鼠标点击时 swal

node.js - 如何使用 Sequelize 创建与特定键的关联?

javascript - 找不到入口模块中的错误 : Error: Can't resolve 'babel-loader'

javascript - 将两个动态键分配给数组

javascript - 禁用按钮仍然监听点击事件

Javascript - 是否可以有 3 个“if”变量或者这是一个错误?

javascript - 在 Angular 和 rxjs 映射函数中使用类型断言

node.js - NPM 安装 - 忽略错误

coffeescript - 告诉我 "right way"从 JSON 构建对象