2017-12-26 11 views
0

は ような様々なタイプのスコアを維持する辞書を、検討することができforEachの内部約束するJavaScriptでスタックループ実行、

A.find({<key>:<value>}) 
.then(res=>{ 
    //gets an array of the response <RES1> 
}) 

配列で今foreach要素、私は最終的に、私はスコアが収集Cに更新する必要があると私は再びループで問い合わせるれている型を取得

B.find({_id : <RES1[i].some_id>}) 
.then(res=>{ 
    //again a new array of responses <RES2> 
}) 

などをやっています

のように
C.find({_id : RES2[i].some_key}).... 

私はどこが間違っているのですか?埋め込みコード

getScoreForEachTypes() { 
    User.find({ company: req.params.company }) 
     .then(users => { 
      var responsesOfAllUsersArr = []; 
      usersForThisCompany = users; 
      users.forEach(user => { 
       responsesOfAllUsersArr.push(Response.find({ email: user.email })); 
      }); 
      return Promise.all(responsesOfAllUsersArr); 
     }) 
     .then(responsesOfAllUsersArr => { 
      var data = { _E: 0, _M: 0, _A: 0, _Q: 0, _E: 0 }; 
      responsesOfAllUsersArr.forEach(el => { 
       el.forEach(_el => { 
        var j = getQuestionType(_el.questionId); 
        data[j] += _el.responseChoice; 
       }) 
      }) 
     }); 
} 

function getQuestionType(qid) { 
    return Question.findOne({ _id: qid }) 
     .then(el => { 
      return el.quesType; 
     }) 
     .catch(err => { 
      console.log("err while fetching type of question", err); 
     }); 
} 
+0

どのように 'getScoreForEachTypes()'を使用しますか?その関数には戻り値がありません。 –

+0

ya、私はスタックされている、私はさらに使用する戻り値が必要です。私は{_E:1、_M:4、_A:6、_Q:3、_Eのようなものになる更新されたデータを返す必要があります: 0} –

+0

'User.find'の直前に' return'を書くとどうなりますか? – Zyigh

答えて

0

最後に私は私の問題を解決しました。 私は配列を維持するだけでした。

function a(){ 
    var data = { PE: 0, RM: 0, BA: 0, AIQ: 0, FE: 0 }; 
    var responsesAll = []; 
    var xyz = []; 
    return User.find({ company: req.params.company }) 
     .then(users => { 
      var responsesOfAllUsersArr = []; 
      usersForThisCompany = users; 
      users.forEach(user => { 
      responsesOfAllUsersArr.push(Response.find({ email: user.email 
     })); 
     }); 
    return Promise.all(responsesOfAllUsersArr); 
    }) 
    .then(responsesOfAllUsersArr => { 
     responsesOfAllUsersArr.forEach(el => { 
      el.forEach(_el => { 
       responsesAll.push(_el); 
       xyz.push(getQuestionType(_el.questionId)) 
      }) 
     }) 
     return Promise.all(xyz); 
    }).then(xyz => { 
     for (var i = 0; i < xyz.length; i++) { 
      data[xyz[i].quesType] += parseInt(responsesAll[i].responseChoice); 
     } 
     return data; 
    }) 
}