2016-03-26 15 views
1

new to stackoverflow/nodejs/mongo/promises/es6。私はいくつかの簡単なクエリと挿入を約束して作成しましたが、今は壁にぶつかっているので、私はいくつかの助けを求めるだろうと考えました。nodejs mongodb es6 - 外部キーデータを含むフェッチリストを約束します。

私は、作成者(所有者)と(ワークアウト)の名前を参照してルーチンリストを取得して、関連する(1to1)ルーチンをワークアウトとして選択しようとしています。

私はここでアイデアを試してみた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]); 
}); 

ここで編集をしてみてください - JavaScript closure inside loops – simple practical example - この質問は約束チェーンではなく、ループ内の閉鎖についてです。私は今私の解決策についての助言を期待しています。

+0

「var」ではなく「let」を使用してください。 – jib

+0

[ループ内のJavaScriptクロージャーの可能な複製 - 簡単な実用的な例](0120-18753) – jib

+0

私はletのことを知らなかったが、私はそれを行ってあげるよ。 私は本当に重複の可能性については何の相関関係も見ませんが、経験はほとんどありませんので、私は何を知っていますか?私は編集ボックスを一番上にしようとしましたが、説明はどこにも現れていないようですので、ここに書きます。 – nikrb

答えて

1

フォーラムに投稿するための思考と切り落としコードを編成する方法があります...私は問題を解決するために努力しましたが、少なくとも私は働くものがあります。それは私にとって正しいとは思えず、確かにフラットではないので、あなたがより良い/適切な方法を知っていれば、ありがとう、よろしくお願いします。

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); 
}); 
関連する問題