首页 > 解决方案 > 在构造函数之前调用 Typescript/javascript 方法

问题描述

所以我有一个问题,我创建了一个 postgres 类。但是,当连接到我的数据库时,我注意到在构造函数之前调用了一个函数。这是我的代码

import { Client } from 'pg';
import { Config } from './config/postgres'

class PostgresHandler {
    client: Client;
    status: boolean | undefined = false;
    constructor(){
        this.client = new Client(Config)
        this.client.connect(err => {
            if (err) {
              console.error('connection error', err.stack)
              this.status = false
            } else {
              console.log('connected')
              this.status = true
            }
          })
    }


    retreiveImageData() {
        console.log(this.status)
    }
}

export {PostgresHandler}

调用这个类

 var psql = new PostgresHandler_1.PostgresHandler();
 psql.retreiveImageData()

输出:

false
connected

如何让我的构造函数在类中的任何其他方法之前先运行?我正在尝试与 postgres 建立连接并将连接状态设置为 true。

标签: node.jstypescriptpostgresql

解决方案


您正在类构造函数中执行异步操作。this.client.connect将函数作为参数,以便让您知道它何时完成。

因此,您的同步代码按以下顺序执行:

  1. 类构造函数运行
  2. this.client.connect被调用,并被传递一个函数以在它(最终)连接时运行。
  3. 构造函数完成执行。
  4. psql.retreiveImageData()被执行
  5. 一段时间后,传递给的回调connect被执行。

通常,您会将其包装在一个 Promise 中并在执行任何需要建立连接的操作之前等待它。但这有点棘手,因为类构造函数不能async

一个好的解决方案是打破与创建班级的联系。这给了你更多的控制权。

这正是pg图书馆所做的:

this.client = new Client(Config)
this.client.connect(err => { //...

请注意如何创建实例和连接是两个步骤。

你需要做同样的事情:

class PostgresHandler {
    client: Client;
    status: boolean | undefined = false;
    constructor(){
        this.client = new Client(Config)
    }

    async connect() {
      try {
        await this.client.connect()
        console.log('connected')
        this.status = true
      } catch (err) {
        console.error('connection error', err.stack)
        this.status = false
      }
    }

    retreiveImageData() {
        console.log(this.status)
    }
}

现在您可以await将您的自定义类与:

async function someAsyncFunction() {
  var psql = new PostgresHandler();
  await psql.connect()
  psql.retreiveImageData() // Should log true once the connection is established.
}
someAsyncFunction()

或者:

var psql = new PostgresHandler();
psql.connect().then(() => {
  psql.retreiveImageData() // Should log true once the connection is established.
}) 

操场


推荐阅读