Phonegap(Cordova)アプリでアイテムのリストを表示しようとしていますが、各アイテムには追加のクエリが必要です。
わかりやすくするために、例を挙げて説明します。たとえば、aにstudent
は複数course
のsを含めることができ、aにcourse
は多くstudent
のs(多対多)を含めることができ、学生が登録されているコースを示すリストを表示したいとします。このような:
- 学生1:コース1、コース2
- Student2:コース1、コース3、コース5
- Student3:コース2
- ..。
まず、すべての学生を反復処理するためのクエリが必要です。次に、学生ごとに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!');
});
ここで、問題は、2番目のコールバック関数(「TODO」がある場合)で、前のクエリのデータへの参照がないことです。たとえば、これを実行しようとするalert(i)
と、76にアラートが表示されます。これは。と同等resultSet.rows.length
です。これは明らかに、2つのコールバック関数の両方が非同期であるためです。この問題を解決して、上記のようにリストを印刷するにはどうすればよいですか?
どんな助けでも大歓迎です。