Cada vez que ejecuto este código, la función content_2 se ejecuta primero en lugar de content_1. El siguiente código se ejecuta de forma asíncrona y la segunda función usa una variable en la primera función a través de "node.js store" para ejecutarse, por lo que necesito content_2 para esperar a que content_1 finalice antes de que comience a ejecutarse, quiero que se ejecute de forma sincrónica.
const content_1 = function main_Content(req, res, callback) { const assert = require('assert'); const fs = require('fs'); const mongodb = require('mongodb'); const mv = require('mv'); var filename = req.body.Filename + Math.ceil((Math.random() * 1000000000000) + 10); console.log(req.body.Filename) //CREATE A FILE fs.writeFile(filename + '.html', req.body.Content, (err) => { if (err) throw err; console.log('File was created successfully...'); }); //MOVE TO UPLOADS const currentPath = path.join(__dirname, "../", filename + ".html"); const destinationPath = path.join(__dirname, "../uploads", filename + ".html"); mv(currentPath, destinationPath, function(err) { if (err) { throw err } else { console.log("Successfully moved the file!"); } }); const uri = 'mongodb://localhost:27017'; const dbName = 'registration'; const client = new mongodb.MongoClient(uri); client.connect(function(error) { assert.ifError(error); const db = client.db(dbName); var bucket = new mongodb.GridFSBucket(db); //UPLOAD FILE TO DB THROUGH STREAMING fs.createReadStream('./uploads/' + filename + '.html'). pipe(bucket.openUploadStream(filename + ".html")). on('error', function(error) { assert.ifError(error); }). on('finish', function(res) { var result = res._id store.set('id', result); //process.exit(0); }); });}
const content_2 = function metaData(req, res, callback) { const obj = new ObjectId() var filename = req.body.Filename + Math.ceil((Math.random() * 1000000000000) + 10); const slice = require('array-slice') var id = store.get('id'); console.log(id) var objID = slice(id, 14, 24) console.log(objID + '2nd') Key.findByIdAndUpdate(req.body.id, {$push: {Articles:{Title: req.body.Title, Desc:req.body.Desc, Content: {_id: `ObjectId("${objID}")`}}} }, (err, docs) => { if(err){ console.log(err) }else{ console.log('done' + obj) } });}
Te daré dos ejemplos. El primero será usar promesas. El segundo usará async await. Sin embargo, la salida es exactamente la misma.
Supongamos esos tres métodos. Alguien limpia una habitación, "luego" alguien verifica si la habitación está limpia, "luego" se realiza un pago.
versión promesas
const cleanRoom = new Promise((res, rej) => { console.log("Cleaning room..."); setTimeout(() => { console.log("Room clean!"); res(); }, 2000); }); const cleanCheckup = () => { return new Promise((res, rej) => { console.log("Clean checkup..."); setTimeout(() => { console.log("Checkup complete!"); res(); }, 2000); }); } const payMoney = () => { console.log("Open Wallet!"); return new Promise((res, rej) => { setTimeout(() => { res("50€"); }, 2000); }); } cleanRoom .then(cleanCheckup) .then(payMoney) .then(console.log);Versión asíncrona/en espera
const sleep = mils => { return new Promise(r => setTimeout(r, mils)); }; const cleanRoomAW = async () => { console.log("Cleaning room..."); await sleep(2000); console.log("Room clean!"); }; const cleanCheckupAW = async () => { console.log("Clean checkup..."); await sleep(2000); console.log("Checkup complete!"); }; const payMonney = async () => { console.log("Open Wallet!"); await sleep(2000); return "50€"; }; async function run() { await cleanRoomAW(); await cleanCheckupAW(); const value = await payMonney(); console.log(value); }; run();Tenga en cuenta el modo de suspensión del método auxiliar, ya que todavía no puede esperar a que se establezca el tiempo de espera en el navegador. (En el nodo js> = 16, creo que no necesita este método auxiliar).
Puede copiar/pegar cualquiera de las dos versiones en la consola del navegador y confirmar que ambas versiones se ejecutan sincrónicamente a pesar de la naturaleza asincrónica de setTimeout.