nodejs mongodb es6-promise用外键数据获取列表

新增到stackoverflow / nodejs / mongo / promises / es6。 我已经成功地创build了一些简单的查询和插入,使用承诺,但现在已经对墙,所以想我会寻求一些帮助。

我想通过查找一个创build者(所有者)和(锻炼)名称来检索例程列表,以挑选与例程相关的锻炼(1to1)。

我在这里尝试过的想法不是承诺只是callback? 以及如何链接和分享先前的结果与承诺,但似乎无法得到一个循环工作与平面链接的想法。

所以,在伪代码

getRoutineList foreach routine: get user account using Routine.email get workout for Routine, using user._id and Routine.workout_name return the list of routines and workouts 

我最初的想法是基于我目前的工作和我有限的经验。

 var rp = routines.find( {owner : user_id}).toArray().then( function( routine_list){ for( var i =0; i<routine_list.length; i++){ var routine = routine_list[i]; var ap = accounts.find( {email:routine.creator}).toArray().then( function( creator){ var workout_owner = creator[0]; var creator_id = workout_owner._id.toHexString(); // .toString(); var wp = workouts.find( { owner : creator_id, name : routine.ofWorkout}) .toArray().then( function( workout_list ){ return workout_list; }); that.promises.push( wp); console.log( "add workout promise count:", that.promises.length); }); that.promises.push(ap); console.log( "add account promise count:", that.promises.length); } return routine_list; }); that.promises.push( rp); console.log( "add routine promise count:", that.promises.length); Promise.all( that.promises).then( function( promise_results){ console.log( "promises count:", that.promises.length); console.log( "promises complete, data:", promise_results); var data = {}; data["routines"] = promise_results[0]; var workouts = []; for( var i = 1; i<promise_results.length; i++){ workouts.push( promise_results[i]); } data["workouts"] = workouts; res.status(200).send( [promise_results]); }); 

尝试在这里编辑 – 这个问题是关于承诺链接,而不是循环内闭包 – 循环内的JavaScript闭包 – 一个简单的实例 。 我现在希望得到关于我的解决scheme的build议。

有一些关于组织的想法和裁减代码张贴在论坛上…我已经设法解决这个问题,至less我有一些工作。 它不“看起来”对我来说,当然是不平坦的,所以如果你知道一个更好的/正确的方式,请说出来,thanx。

 var rp = new Promise( function( resolve, reject){ routines.find( {owner : user_id}).toArray() .then( function( results){ results.forEach( function( obj, ndx, arr){ accounts.find( {email:obj.creator}).next( function( e, acc){ // obj.creator_account = acc; obj.creator_id = acc._id.toHexString(); workouts.find( { owner : obj.creator_id, name : obj.ofWorkout}).next( function( e, workout){ console.log( "got workout:", workout); obj.workout = workout; if( ndx === arr.length-1) resolve( results); }); }); }); }); }).then( function( results){ console.log( "results:", results); res.status(200).send( results); });