Javascript ES6类在初始化新类之后,是否在继续之前等待请求?

Javascript ES6类在初始化新类之后,是否在继续之前等待请求?,javascript,node.js,class,ecmascript-6,Javascript,Node.js,Class,Ecmascript 6,我正在尝试创建这样一个新类: const request = require("request"); class Person { constructor(personName) { request(`http://personapi.com/name/${personName}`, (err, res, body) => { body = JSON.parse(body); this.name = body.nam

我正在尝试创建这样一个新类:

const request = require("request");

class Person {
    constructor(personName) {
        request(`http://personapi.com/name/${personName}`, (err, res, body) => {
            body = JSON.parse(body);
            this.name = body.name;
            this.age = body.age;
            this.gender = body.gender;
        }
    }
}

let person = new Person("Donald Trump");
console.log(person.name);
执行上述操作不起作用,因为它创建了一个还没有属性的新人,因为请求还没有完成。如果我这样做:

let person = new Person("Donald Trump");
setTimeout(() => {
    console.log(person.name);
}, 1000);

它很好用。我知道这是因为它是异步的。在请求完成之前,如何确保未实际设置
让人
?不要担心代码阻塞。

在实例化一个人之前,可能只需要执行一个请求:

const request = require("request");

class Person {
    constructor(obj) {
            this.name = obj.name;
            this.age = obj.age;
            this.gender = obj.gender;
    }
}

let person;

request(`http://personapi.com/name/${personName}`, (err, res, body) => {
    body = JSON.parse(body);
    person = new Person(body);
});

我建议将承诺存储在财产中:

const request = require("request");

class Person {
    constructor(personName) {
        this.ready = 
          request(`http://personapi.com/name/${personName}`, (err, res, body) => {
              body = JSON.parse(body);
              this.name = body.name;
              this.age = body.age;
              this.gender = body.gender;
          });
    }
}

let person = new Person("Donald Trump");
person.ready.then(_ => console.log(person.name));
虽然看起来有点老套。另一个看起来更好的选项,还将与人员相关的逻辑封装在
person
类中:

const request = require("request");

class Person {
    constructor({name, age, gender}) {
      this.name   = name;
      this.age    = age;
      this.gender = gender;
    }

    static fromName(name) {
      return request(`http://personapi.com/name/${personName}`)
        .then(resp => resp.json())
        .then(body => new this(body));
    }
}

Person
  .fromName("Donald Trump")
  .then(person => console.log(person.name);

“在请求完成之前,如何确保未实际设置let person?”不适用于此代码。分配操作不能中断。@Bergi非常有效是。在这种情况下,我将只创建一个新人并按上述方式发送请求。@FelixKling我经常看到库的代码样式如下面两行。他们是如何做到的?@Mortenmolder:很难说没有看到实际的代码。看一看。我建议在类上创建一个静态方法。老实说,这是一种丑陋的方法。构造函数不应该返回承诺。我不认为
request
会返回一个承诺-你可以看到它正在回调如果你存储了承诺,那么数据应该在承诺内。分配给
这个.name
age
gender
仍然是错误的。
静态
方法中新建这个(身体)
?——真令人困惑抱歉,那是不可能的。“我希望所有内容都在类中。”Mortenmolder然后将执行请求的方法放入类中。只是不要把它放在一个实例上——它需要在实例化之前发生。