I'm new to javascript and I'm strugguling with synchonous/asynchronous function call, especially here, as i'm trying to concatenate data from two collections of the same database.
Here is my code:
function getAcquisitionAreas(req) {
PartAreas.getAcquisitionAreasByAcquisitionId(req.params.id, (err, partArea) => {
particle.areas = partArea._doc.areas;
});
}
function getAcquisitionPerimeters(req) {
PartPerimeters.getAcquisitionPerimetersByAcuiqisiontId(req.params.id, (err, partPerimeter) => {
particle.borders_intern = partPerimeter._doc.borders_intern;
particle.borders_extern = partPerimeter._doc.borders_extern;
});
}
function getParticleData(req, callback) {
getAcquisitionAreas(req);
getAcquisitionPerimeters(req);
callback;
}
function constructParticle(req) {
particle.id = req.params.id;
}
// Register
router.get('/get/:id', (req, res, next) => {
getParticleData(req);
constructParticle(req);
res.send(particle);
});
and it returns {"id":"1508515120"}
, this means it execute res.send(particle)
before putting in areas and borders. How should I implement this? I've seen Promises but couldn't make it work, and implementing callback methods in callback methods seems very dirty.
Thanks!
Edit
var particle;
function getAcquisitionAreas(req) {
return new Promise((resolve, reject) => {
PartAreas.getAcquisitionAreasByAcquisitionId(req.params.id, (err, partArea) => {
if (err) { reject(err); }
particle.areas = partArea._doc.areas;
resolve();
});
});
}
function getAcquisitionPerimeters(req) {
return new Promise((resolve, reject) => {
PartPerimeters.getAcquisitionPerimetersByAcuiqisiontId(req.params.id, (err, partPerimeter) => {
if (err) { reject(err); }
particle.borders_intern = partPerimeter._doc.borders_intern;
particle.borders_extern = partPerimeter._doc.borders_extern;
resolve();
});
})
}
function constructParticle(req) {
return new Promise((resolve, reject) => {
particle.id = req.params.id;
resolve();
})
}
function sendParticle(res) {
res.send(particle);
}
// Register
router.get('/get/:id', (req, res, next) => {
particle = {};
getAcquisitionAreas(req)
.then(getAcquisitionPerimeters(req))
.then(constructParticle(req))
.then(sendParticle(res));
});
Edit 2
I finally managed to have a working solution:
function getAcquisitionAreas(particle) {
return new Promise((resolve, reject) => {
PartAreas.getAcquisitionAreasByAcquisitionId(particle.id, (err, partArea) => {
if (err) { reject(err); }
particle.areas = partArea._doc.areas;
resolve(particle);
});
});
}
function getAcquisitionPerimeters(particle) {
return new Promise((resolve, reject) => {
PartPerimeters.getAcquisitionPerimetersByAcuiqisiontId(particle.id, (err, partPerimeter) => {
if (err) { reject(err); }
else {
particle.borders_intern = partPerimeter._doc.borders_intern;
particle.borders_extern = partPerimeter._doc.borders_extern;
resolve(particle);
}
});
})
}
// Register
router.get('/get/:id', (req, res, next) => {
particle = {"id":req.params.id};
getAcquisitionAreas(particle)
.then(getAcquisitionPerimeters)
.then((particle) => {res.send(particle)});
});