2017-02-25 10 views
0

こんにちは私はループを実行し、Promisesを使用して返信データを取得する問題があります。ループNode.jsで解決されない解決

私はgetStudentMarksの題名でデータベースから生徒マークを得る方法を持っています。

app.post('/getStudentMarks', function(req, reqs) { 
    ubm.getStudentMarks(req.body.studentId, req.body.studentStandard) 
     .then((data) => { 
      console.log('return data: ' + data); 
     }) 
     .catch((err) => { 
      console.log(err); 
     }); 
}); 

私は、コードを実行し、私は方法を呼び出すだ

getStudentMarks: function(studentId, studentStandard) { 
    console.log("getStudentMarks invoked..."); 
    return new Promise(function(resolve, reject) { 
     r.table('student_subjects').filter({ 
      "studentId": studentId, 
      "studentStandard": studentStandard 
     }).pluck("subjectId", "subjectName").run(connection, function(err, cursor) { 
      if (err) { 
       throw err; 
       reject(err); 
      } else { 
       cursor.toArray(function(err, result) { 
        if (err) { 
         throw err 
        } else { 
         console.log(result.length); 
         if (result.length > 0) { 
          studentSubjectArray = result; 

          var studentMarksSubjectWiseArray = []; 
          studentSubjectArray.forEach(function(elementPhoto) { 
           r.table('student_marks').filter({ 
            "studentId": studentId, 
            "subjectId": studentSubjectArray.subjectId 
           }).run(connection, function(err, cursor) { 
            if (err) { 
             throw err; 
             reject(err); 
            } else { 
             cursor.toArray(function(err, result_marks) { 
              var studnetMarksDataObject = { 
               subjectId: studentSubjectArray.subjectId, 
               subjectName: studentSubjectArray.subjectName, 
               marks: result.marks 
              }; 
              studentMarksSubjectWiseArray.push(studnetMarksDataObject); 
             }); 
            } 
           }); 
          }); 
          resolve(studentMarksSubjectWiseArray); 
         } 
        } 
       }); 
      } 
     }); 
    }); 
} 

、そのエラーがない絶対に細かい作業。私はstudentMarksSubjectWiseArray配列内のすべての学生マークオブジェクトを取得します。しかし、問題は、studentSubjectArrayループが完了する前でさえ、解決が実行されており、空の配列が返されています。どのように問題を解決するのですか?私はPromisesの権利をしていないことを理解しています。私はPromisesに新しいので、正しい方法を理解することができません。

+0

注意、あなたのスコープ内で実行が投げた後に停止される: 'reject'は発生しません。 –

+0

@ L.Meyer私はあなたを得なかった。問題は私のループだと思う。 –

答えて

0

studentSubjectArray.forEachステートメントの内部では、非同期操作のセットr.table(...).filter(...).run()を実行し、その結果を配列にプッシュするためです。ただし、resolve()を実行した後にこれらの操作が完了するため、studentMarksSubjectWiseArrayはまだ空です。この場合は、Promise.all()メソッドを使用する必要があります。リターンを好む

let promisesArray = []; 
studentSubjectArray.forEach((elementPhoto) => { 
    let singlePromise = new Promise((resolve, reject) => { 
     // here perform asynchronous operation and do the resolve with single result like r.table(...).filter(...).run() 
     // in the end you would perform resolve(studentMarksDataObject) 

     r.table('student_marks').filter({ 
      "studentId": studentId, 
      "subjectId": studentSubjectArray.subjectId 
     }).run(connection, function(err, cursor) { 
      if (err) { 
       throw err; 
       reject(err); 
      } else { 
       cursor.toArray(function(err, result_marks) { 
        var studnetMarksDataObject = { 
         subjectId: studentSubjectArray.subjectId, 
         subjectName: studentSubjectArray.subjectName, 
         marks: result.marks 
        }; 
        resolve(studnetMarksDataObject); 
       }); 
      } 
     }); 
    }); 
    promisesArray.push(singlePromise) 
}); 

Promise.all(promisesArray).then((result) => { 
    // here the result would be an array of results from previously performed set of asynchronous operations 
}); 
+0

私はそれについて読む。しかし、私はどのように私のコードでそれは私が得ていない何かを適用することができます。あなたがスニペットを提供できるなら、それは私のために非常に役立つでしょう。 –

+0

私は 'Promise.all'を使ってどのようにそれを行うことができるかを示す答えを更新しました – piotrbienias

+0

ありがとう。コードを試してみましょう、できるだけ早くあなたに戻ってきます。 –