node.js - 在构造函数之前调用 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。
解决方案
您正在类构造函数中执行异步操作。this.client.connect
将函数作为参数,以便让您知道它何时完成。
因此,您的同步代码按以下顺序执行:
- 类构造函数运行
this.client.connect
被调用,并被传递一个函数以在它(最终)连接时运行。- 构造函数完成执行。
psql.retreiveImageData()
被执行- 一段时间后,传递给的回调
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.
})
推荐阅读
- c# - 客户证书 - 我应该使用自签名还是 CA 颁发?
- testing - 在Firefox浏览器中执行appium测试用例时,浏览器崩溃说“Firefox崩溃”
- azure - 从 Visual Studio 部署 azure 函数以及类库
- neo4j - Neo4j 查询 WHERE 在一个非常长的列表中
- python - 如何优化 SQL 查询以减少运行时间?
- lighthouse - PagespeedInsights 和 Lighthouse 的区别
- python - 如何将多个 MDSwiperItem 添加到 MDSwiper:]?
- android - 如何使用 AR Core 在同一个活动中渲染多个 AR 模型?
- ios - 从剪贴板粘贴不适用于 iOS 模拟器上的 React Native
- javascript - 我可以用普通函数调用异步函数吗?Javascript