2017-02-25 4 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

반환과 마찬가지로 throw가 발생하면 범위에서 실행이 중지됩니다. '거부'가 발생하지 않습니다. –

+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

감사합니다. 내가 코드를 시도하자, 최대한 빨리 돌아올 것입니다. –

관련 문제