Probablemente mal redactado, entiendo asíncrono/promesas/devoluciones de llamada.
Lo que estoy tratando de hacer es crear un módulo que pueda ser requerido ( database.js de datos.js), que luego puedo llamar a métodos como database.insert() y database.read() .
Así que aquí está mi código:
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, } La pregunta es: ¿Cómo hago para que cuando se llame a database.insert() , se procesará instantáneamente si db y queue ya están definidos, pero si no lo están, esperará hasta que lo estén, luego continuará procesando como de costumbre? ?
Puede asignar el resultado de una promesa a una variable y puede llamarla más then . Por ejemplo:
const queuePromise = client.connect().then(e => { console.log('connected to database'); const db = client.db('filemanager'); const queue = db.collection('queue'); return queue; }); Ahora tiene una variable llamada queuePromise que es una promesa que se resuelve en un objeto db.collection . Entonces puedes usar esa promesa así
queuePromise.then((queue) => { // do something with the queue });Entonces puedes tener una función como esta
const insert = (data, callback) => { queuePromise.then((queue) => { queue.insertOne(data).then(callback); }); };O incluso mejor, no use el patrón de devolución de llamada y siga así
const insert = (data) => { return queuePromise.then((queue) => { return queue.insertOne(data); }); }; // use the callback in a `then` after calling `insert` insert(data).then(callback);