stackoverflow/nodejs/mongo/promises/es6 的新功能。我已经使用 Promise 成功创建了一些简单的查询和插入,但现在遇到了困难,所以我想寻求一些帮助。
我正在尝试检索例程列表,并查找创建者(所有者)和(锻炼)名称,以挑选与例程相关(1对1)的锻炼。
我在这里尝试过想法Aren't promises just callbacks?和 How to chain and share prior results with Promises但似乎无法找到一个循环来使用扁平链接的想法。
所以,在伪代码中
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]);
});
在这里尝试编辑 - 这个问题是关于 promise 链,而不是循环内的闭包 - JavaScript closure inside loops – simple practical example 。我现在希望得到有关我的解决方案的建议。
最佳答案
有一些关于组织思想和削减代码以在论坛中发布的内容......我已经设法解决了这个问题,至少我有一些有用的东西。它对我来说“看起来”不正确,而且肯定不平坦,所以如果您知道更好/正确的方法,请大声说出来,谢谢。
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);
});
关于node.js - nodejs mongodb es6-promises 获取带有外键数据的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36241254/