Javascript 对成功构建的对象进行编码的最惯用方法取决于Nodejs中的http调用

Javascript 对成功构建的对象进行编码的最惯用方法取决于Nodejs中的http调用,javascript,node.js,Javascript,Node.js,我是node的新手,目前正在努力寻找一种最简单的方法来创建一个对象,该对象的构造取决于http查询的结果。在查询返回并成功解析之前,该对象是无用的,因此在没有初始化对象的情况下从构造函数返回会让人感觉错误,但我读到的关于node的所有信息都表明,我应该保持异步 我可以像这样同步写,请原谅伪代码 function FooConfig(cfg_url) { // use httpsync to get the response synchronously var response = get

我是node的新手,目前正在努力寻找一种最简单的方法来创建一个对象,该对象的构造取决于http查询的结果。在查询返回并成功解析之前,该对象是无用的,因此在没有初始化对象的情况下从构造函数返回会让人感觉错误,但我读到的关于node的所有信息都表明,我应该保持异步

我可以像这样同步写,请原谅伪代码

function FooConfig(cfg_url) {
  // use httpsync to get the response synchronously
  var response = get(cfg_url);

   if (response.is_good()) {
     // parse response and set member data from response
     this.bar = response.bar
   } else {
     // Raise an error
   }
};
或者异步地

function FooConfig(cfg_url) {
  // Use the regular http module and make the request asynchronously
  var newCfg = this;
  http.get(cfg_url, function(response) {
    if (response.is_good()) {
      newCfg.bar = respsonse.bar
    } else {
      // Raise an error
    }
  });
});
异步版本的问题是,如果请求未完成,任何依赖于FooCfg实例的客户端代码都可能失败

i、 e


这是一个可以同步的实例吗?这应该只在初始化节点应用程序时发生一次。

我将构造和初始化分为两个不同的部分,并让初始化方法返回一个承诺,或者至少返回一个回调。初始化完成后,使用它。

我会使用a来完成此操作。基本上,不是在构造函数中进行异步获取,而是在工厂方法中进行,并将获取结果传递给构造函数。然后,通过回调传回新对象

因此,您的构造函数可能如下所示:

function FooConfig(cfg_data) {
    this.bar = cfg_data.bar
}
您的工厂方法将类似于:

var fooFactory(callback) {
    http.get(cfg_url, function(response) {
        if (response.is_good()) {
            callback(null, new FooConfig(response)) // Here's the actual constructor call
        } else {
            callback(new Error("something bad happened"))
        }
    });
}
你可以这样称呼它:

fooFactory(function(err, myCfg) {
    if (err) {
        // handle error
    } else {
        var myDependentObject = new DependsOnConfig(myCfg);
    }
});

相关的,即使不是重复的:构造函数需要同步。你的意思是像@MikeS的回答一样,还是有一个接受回调/返回承诺的init方法,并让实例在此之前不可用?
fooFactory(function(err, myCfg) {
    if (err) {
        // handle error
    } else {
        var myDependentObject = new DependsOnConfig(myCfg);
    }
});