Node.js中的异步构造函数

时间:2019-04-04 13:58:39

标签: node.js asynchronous async-await

我正在尝试运行“猫鼬”,并且仅在连接时继续执行我的任务,但是发生的事情是该任务先运行,然后再连接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

3 个答案:

答案 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函数。