Ich bin neu in Javascript und ich habe mit synchonischen/asynchronen Funktionsaufruf kämpfen, vor allem hier, wie ich versuche, Daten aus zwei Sammlungen der gleichen Datenbank zu verketten.Synchrone Datenbank abrufen Javascript
Hier ist mein 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);
});
und es gibt {"id":"1508515120"}
, bedeutet dies, es res.send(particle)
ausgeführt werden, bevor in den Bereichen und Grenzen setzen. Wie soll ich das umsetzen? Ich habe Versprechen gesehen, konnte es aber nicht funktionieren lassen, und die Implementierung von Callback-Methoden in Callback-Methoden scheint sehr dreckig zu sein.
Danke!
bearbeiten
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
ich es endlich geschafft, eine funktionierende Lösung zu haben:
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)});
});
Ich glaube, dass [diese] (https://stackoverflow.com/a/4700433/863110) Ihre Frage beantworten. –
Vielleicht sollten Sie sich darauf konzentrieren, warum Versprechungen nicht funktionieren und wie Sie sie zur Arbeit bringen, es scheint, dass sie dafür verwendet werden (was Sie erreichen wollen). – jdmdevdotnet