각 항목에 추가 쿼리가 필요한 Phonegap (Cordova) 앱에 항목 목록을 표시하려고합니다.두 번째 쿼리가 첫 번째 쿼리에 의존하는 두 개의 쿼리
간단히하기 위해 예제로 설명하겠습니다. student
에 (many-to-many)을 많이 가질 수있는 course
및 course
을 가질 수 있으며 학생이 어떤 코스에 등록했는지 보여주는 목록을 표시하려고합니다.
- Student1 :이처럼 course1, course3 물론 5
- Student3 : course1,
- Student2 course2 course2
- ...
첫째, 나는에 질의를 필요로 모든 학생을 반복 한 다음 각 학생에 대해 DB에 쿼리하여 어떤 과목을 등록했는지 알아야합니다.
db.transaction(function(tx) {
tx.executeSql('SELECT `student`.`id`, `student`.`name` ' +
'FROM `student`',
[],
function(tx, resultSet) {
for(var i = 0; i < resultSet.rows.length; i++) {
tx.executeSql('SELECT `course`.`name` ' +
'FROM `student_has_course` ' +
'INNER JOIN `student` ON `student_has_course`.`student_id` = `student`.`id` ' +
'INNER JOIN `course` ON `student_has_course`.`course_id` = `course`.`id` ' +
'WHERE `student`.`id` = ?'
[resultSet.rows.item(i).id],
function(tx2, resultSet2) {
// TODO
});
}
});
}, function(err) {
showError('Error getting students from the DB (' + err.message + ')');
}, function() {
alert('success!');
});
이제 문제는 두 번째 콜백 함수 ("TODO"가있는 위치)에서 이전 쿼리의 데이터에 대한 참조가 없다는 것입니다. 예를 들어, alert(i)
을 시도하면 76으로 알려주며 이는 resultSet.rows.length
과 같습니다. 이는 두 콜백 함수가 모두 비동기 적이기 때문에 분명합니다. 위에 표시된 것처럼이 문제를 극복하고 목록을 인쇄하려면 어떻게해야합니까?
도움을 주시면 감사하겠습니다.
고맙습니다. @jop. 이것은 단지 해결 방법이지만, 어떤 상황에서도 작동 할 수있는 일반적인 솔루션을 찾고 있습니다. – satoshi
. 이 예제에서는 하나의 SQL이 여전히 더 좋아 보이는 경우에도 더 일반적인 솔루션을 제공하기 위해이 스크립트를 편집했습니다. – jop
감사합니다. 그 해결책이 작동했습니다 :) – satoshi