2016-03-26 55 views
1

新增至stackoverflow/nodejs/mongo/promises/es6。我已經成功地創建了一些簡單的查詢和插入,使用承諾,但現在我已經對牆壁,所以想我會尋求一些幫助。nodejs mongodb es6-promise使用外鍵數據獲取列表

我想通過查找一個創建者(所有者)和(鍛鍊)名稱來檢索一個例程列表,以挑選出與例程相關的鍛鍊(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

嘗試使用'let'而不是'var'。 – jib

+0

[JavaScript裏面的循環封閉 - 簡單實用的例子]可能的重複(http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – jib

+0

我不知道讓,我會放棄它。 我真的沒有看到任何可能的重複相關,但我沒有經驗,所以我知道什麼 - 但thanx您的意見。我試着將編輯框放在最上面,但解釋似乎並沒有出現在任何地方,所以寫在這裏 - 也是新的。 – nikrb

回答

1

有一些關於組織思想和裁減代碼張貼在論壇上......我已經設法解決這個問題,至少我有一些工作。它對我來說並不「看起來」,當然也不平坦,所以如果你知道一個更好的/正確的方式,請說出來,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); 
});