3

我有以下代码。

class DB {
  constructor(client) {
    this.client = client;
  }
}

export default function store() {
  return new Promise((resolve, reject) => {
    pg.connect(process.env.DATABASE_URL, client => {
      client.query('CREATE TABLE x(name VARCHAR(100))');
      return resolve(new DB(client));
    });
  });
}

有没有办法在类构造函数中移动存储函数并使用 async/await 重写它?

4

2 回答 2

3

AFAIK 你不能将构造函数声明为异步函数。但是,您可以从构造函数返回一个 Promise。这似乎是一个糟糕的想法,所以不要在现实世界中使用它。

// Define the class
class DB {
  constructor() {
    return this.store().then(client => { this.client = client; return this; });
  }

  async store() {
    const client = await new Promise((resolve) => {
      pg.connect(process.env.DATABASE_URL, resolve);
    });
    client.query('CREATE TABLE x(name VARCHAR(100))');
    return new DB(client);
  }
}

// Create an async function environment
(async function handleData() {
  const db = await new DB();
  // Do something with your DB
})();
于 2017-01-30T15:59:03.093 回答
1

您不能完全避免Promise构造函数,因为您需要它来承诺连接:

function connect(url) {
  return new Promise((resolve, reject) => {
    pg.connect(url, resolve);
  });
}

有了它,您可以使用async/ await

export default async function store() {
  const client = await connect(process.env.DATABASE_URL);
  client.query('CREATE TABLE x(name VARCHAR(100))');
  return new DB(client);
}

如果你愿意,你可以将该函数移到你的类中,但我看不出有任何理由:

export default class DB {
  constructor(client) {
    this.client = client;
  }
  static async store() {
    const client = await connect(process.env.DATABASE_URL);
    client.query('CREATE TABLE x(name VARCHAR(100))');
    return new this(client);
  }
}
于 2017-01-30T18:36:32.657 回答