Node.js nodejs中的异步构造函数
我正在尝试运行“Mongoose”,并且仅在连接任务时才继续执行任务,但实际情况是,任务先运行,然后再连接MongoNode.js nodejs中的异步构造函数,node.js,asynchronous,async-await,Node.js,Asynchronous,Async Await,我正在尝试运行“Mongoose”,并且仅在连接任务时才继续执行任务,但实际情况是,任务先运行,然后再连接Mongo 导出类应用程序{ 构造函数(){ 控制台日志(“a1”); this.config(); 控制台日志(“a2”); } 公共异步配置(){ //连接到MongoDB 控制台日志(“b1”); 试一试{ wait mongoose.connect(stringConnection,{useNewUrlParser:true}).finally(); log(“MongoDB正在运行
导出类应用程序{
构造函数(){
控制台日志(“a1”);
this.config();
控制台日志(“a2”);
}
公共异步配置(){
//连接到MongoDB
控制台日志(“b1”);
试一试{
wait mongoose.connect(stringConnection,{useNewUrlParser:true}).finally();
log(“MongoDB正在运行”);
}捕获(错误){
console.log(错误);
process.exit();
}
控制台日志(“b2”);
}
}
答复:
a1
b1
a2
MongoDB Running
b2
我想要的答案是:
a1
b1
MongoDB Running
b2
a2
您可以使用
Promise.then
(因为async
函数隐式返回Promise
s),在config()
之后,在其回调中填充您想要做的事情
constructor() {
console.log("a1");
this.config().then(_ =>
console.log("a2");
});
}
一个好方法是了解
最好的方法是在配置中返回一个承诺,然后在承诺中使用then函数。异步构造函数可能是一个反模式,正是因为它在创建实例时没有提供正确的控制流。当使用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();
它工作了,非常感谢,但是当我实例化“newclass()”时,它又变为异步的,所以它最终从下面运行代码,然后启动mongo@wellington.silverio是的,它是异步的,因为承诺和async
正在使用。我不知道为什么这是个问题<代码>常量应用程序=新应用程序();wait app.init()
应该会产生您想要的序列。它工作正常,非常感谢,但当我实例化“new Class()”时,它又变为异步,因此它最终从下面运行代码,然后启动mongoCode:console.log(“1”);const app=新app();控制台日志(“2”);响应:1 a1 b1 a2 2 MongoDB运行B2B它工作了,非常感谢,但是当我实例化“new Class()”时,它再次变为异步,因此它最终运行下面的代码,然后启动mongoCode:console.log(“1”);const app=新app();控制台日志(“2”);响应:1 a1 b1 a2 2 MongoDB运行b2