2017-10-23 17 views
0

私はjavascriptが新しく、特に同じデータベースの2つのコレクションからデータを連結しようとしているので、ここでは同期/非同期の関数呼び出しでは苦労しています。これは、それが地域や国境に入れる前res.send(particle)を実行すること、同期データベース検索javascript

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

、それは{"id":"1508515120"}を返します。

は、ここに私のコードです。これをどのように実装すればよいですか?私は約束を見ましたが、それを動作させることができず、コールバックメソッドでのコールバックメソッドの実装は非常に汚いようです。

ありがとうございます!

編集

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

私は最終的に実用的なソリューションを持っているために管理2

編集:

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

私は[this](https://stackoverflow.com/a/4700433/863110)があなたの質問に答えてくれると確信しています。 –

+1

おそらく、なぜ約束が働かなかったのか、そしてそれらを働かせる方法に焦点を当てるべきでしょうか、それは彼らが使っているもの(あなたが達成しようとしているもの)だと思われます。 – jdmdevdotnet

答えて

0

この達成するためのいくつかの方法があります(約束は、収量、非同期/待っています) 。あなたは約束を試したので、それを通りましょう。私はここでいくつかの仮定をしてきましたが、それを行うためのもっときめ細かな方法がありますが、下のコードサンプルを投稿したものがあれば、

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

私は約束を拒否されたときにスローされるエラーを引くようなことをやっていないよ、と私には途中でコールバックに約束から切り替えるには奇妙なようだが、うまくいけば、上記の例では、あなたを与えるだろうそれらを使用する方法の基本的なアイデア。

+0

ありがとう!あなたがあなたの主題を知っているようだから、非同期配列のようなものを見て、あなたの関数を置くことができ、それらは順番に実行されます。それはあなたに鐘を鳴らしますか?私はYouTubeのビデオでそれを見て、それを見つけることができません。 npmでasync-arraysが見つかりましたが、それはそうではありません。 –

+0

こんにちは、私はあなたのコードを試して、両方の領域と境界線を持つことができなかった、私は領域があった。あなたの提案に従ってコードを改善しようとしましたが、うまくいきません。どうして私は今、領域や周長が得られないのか、本当に分かりません。私の新しいコードは、編集タグ –

+0

の下で問題になっています編集を見ると、あなたはそれを理解したように見えますか? @ GaetanL'Hoest –