我正在尝试运行“猫鼬”,并且仅在连接时继续执行我的任务,但是发生的事情是该任务先运行,然后再连接Mongo。
export class App {
constructor() {
console.log("a1");
this.config();
console.log("a2");
}
public async config() {
// Connect to MongoDB
console.log("b1");
try {
await mongoose.connect(stringConnection, { useNewUrlParser: true }).finally();
console.log("MongoDB Running");
} catch (error) {
console.log(error);
process.exit();
}
console.log("b2");
}
}
答案:
a1
b1
a2
MongoDB Running
b2
我想要的答案:
a1
b1
MongoDB Running
b2
a2
答案 0 :(得分:2)
异步构造函数可能是一种反模式,恰恰是因为在创建实例时它没有提供适当的控制流。预期在使用new
创建实例后,实例就可以使用了,但是还没有准备好。
一种适当的处理方法是让异步钩子在类外部执行:
export class App {
constructor() {}
async init() {
console.log("a1");
await this.config();
console.log("a2");
}
async config() {
...
}
}
...
const app = new App();
await app.init();
答案 1 :(得分:0)
您可以使用Promise.then
(因为async
函数隐式返回Promise
s),将您想要完成的事情塞入config()
的{{1}中}回调。
then
答案 2 :(得分:0)
一种好方法是学习Promises
最好的方法是在配置中返回一个Promise,然后可以在Promise中使用then函数。