0

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つのコールバック関数の両方が非同期であるためです。この問題を解決して、上記のようにリストを印刷するにはどうすればよいですか?

どんな助けでも大歓迎です。

4

1 に答える 1

2

次のように、属性をコールバック関数自体にアタッチすることで、これを解決できるはずです。

cb = function cbfunc() {
     doStuffWith(cbfunc.data)
}
cb.data = ... // whatever
tx.executeSQL(..., cb)

それでも、1 回のクエリで期待される結果を生成することで 2 番目のコールバックを回避できるかどうか、よく考えてみます。この場合:

select student.id, student.name, course.name from student
    inner join student_has_course on student.id = student_has_course.student_id
    inner join course on student_has_course.course_id = course.id
        order by student.id;

ループ内で、student.id を前の反復からのものと比較して、改行と新しい学生名を出力するタイミングを知り、目的の出力形式を取得します。

于 2012-11-14T09:30:04.587 に答える