2017-10-23 4 views
0

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)}); 
}); 
+0

Ich glaube, dass [diese] (https://stackoverflow.com/a/4700433/863110) Ihre Frage beantworten. –

+1

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

Antwort

0

Es gibt mehrere Möglichkeiten, dies zu erreichen (Promises, Yield, Async/Await) . Sie haben Versprechungen versucht, also lassen Sie uns das durchgehen. Ich habe hier einige Annahmen gemacht, und es gibt bessere Möglichkeiten, es zu tun, aber angesichts dessen, was du gepostet hast, sollte das Code-Beispiel unten dich am meisten erreichen, wenn nicht sogar ganz dort, denke ich.

function getAcquisitionAreas(req) { 
    return new Promise((resolve, reject) => { 
    PartAreas.getAcquisitionAreasByAcquisitionId(req.params.id, (err, partArea) => { 
      if (err) { return 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) { return reject(err); } 
     particle.borders_intern = partPerimeter._doc.borders_intern; 
     particle.borders_extern = partPerimeter._doc.borders_extern; 
     resolve(); 
     }); 
    }) 
} 

function getParticleData(req, callback) { 
    getAcquisitionAreas(req) 
     .then(getAcquisitionPerimeters(req)); 
     .then(callback); 
} 

function constructParticle(req) { 
    particle.id = req.params.id; 
} 

// Register 
router.get('/get/:id', (req, res, next) => { 
    getParticleData(req,() => { 
     constructParticle(req); 
      res.send(particle); 
    }); 
}); 

Ich bin nicht, wenn die Versprechungen abgelehnt geworfen Dinge wie fangen die Fehler machen, und mir scheint es seltsam, von Versprechungen in der Mitte auf einen Rückruf zu wechseln, aber hoffentlich über das Beispiel Sie geben ein Grundidee, wie man sie benutzt.

+0

Danke! Da Sie Ihr Thema zu kennen scheinen, habe ich auch etwas wie ein asynchrones Array gesehen, in das Sie Ihre Funktionen einfügen können und die nacheinander ausgeführt werden. Ruft es dich an? Ich habe es in einem YouTube-Video gesehen und kann es nicht finden. Ich habe Async-Arrays auf npm gefunden, aber es scheint nicht so zu sein. –

+0

Hallo, ich habe versucht, Ihren Code und konnte nicht beide Bereiche und Perimeter haben, ich hatte nur Bereiche. Ich habe versucht, meinen Code nach Ihrem Vorschlag zu verbessern, aber es funktioniert nicht. Ich habe wirklich keine Ahnung, warum ich jetzt keine Fläche oder Perimeter bekomme. Mein neuer Code ist in der Frage, unter edit tag –

+0

Blick auf die Bearbeitung jetzt sieht es so aus als hättest du es herausgefunden? @ GaetanL'Hoest –