如何让函数等到数据库连接建立后再继续?
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);
可能措辞不当,我明白了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);