Node.js nodejs中的异步构造函数

Node.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正在运行

我正在尝试运行“Mongoose”,并且仅在连接任务时才继续执行任务,但实际情况是,任务先运行,然后再连接Mongo

导出类应用程序{
构造函数(){
控制台日志(“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