如何让函数等到数据库连接建立后再继续?

How do I make a function wait until a database connection is established before continuing?

可能措辞不当,我明白了async/promises/callbacks。

我想做的是创建一个可能需要的模块 (database.js),然后我可以调用 database.insert()database.read() 等方法。

这是我的代码:

require('dotenv').config()
const {MongoClient} = require('mongodb');
const client = new MongoClient(process.env.MONGO_URI);

var db, queue;

client.connect().then(e => {
    console.log('connected to database');

    db = client.db('filemanager');
    queue = db.collection('queue');
});

function insert (data, cb) {
    queue.insertOne(data)
        .then(res => {cb()})
}

module.exports = {
    insert: insert,
}

问题是:当 database.insert() 被调用时,如果 db 和队列已经定义,它将立即处理,但如果它们没有定义,它将等到它们被定义,然后会像往常一样继续处理吗?

您可以将 promise 的结果分配给一个变量,稍后您可以对其调用 then。例如:

const queuePromise = client.connect().then(e => {
    console.log('connected to database');

    const db = client.db('filemanager');
    const queue = db.collection('queue');

    return queue;
});

现在你有一个名为 queuePromise 的变量,它是一个解析为 db.collection 对象的 Promise。然后你可以像这样使用那个承诺

queuePromise.then((queue) => {
    // do something with the queue
});

所以你可以有这样的功能

const insert = (data, callback) => {
    queuePromise.then((queue) => {
        queue.insertOne(data).then(callback);
    });
};

或者更好的是,不要使用回调模式并像这样

const insert = (data) => {
    return queuePromise.then((queue) => {
        return queue.insertOne(data);
    });
};

// use the callback in a `then` after calling `insert`
insert(data).then(callback);