gpt4 book ai didi

javascript - 两个查询,其中第二个查询依赖于第一个查询

转载 作者:行者123 更新时间:2023-12-02 19:13:44 24 4
gpt4 key购买 nike

我正在尝试在 Phonegap (Cordova) 应用中显示项目列表,其中每个项目都需要额外的查询。

为了简单起见,我将通过一个例子来解释它。假设一个学生可以有多个类(class),一个类(class)可以有许多学生(多对多) -很多),我想显示一个列表,显示学生注册了哪些类(class)。像这样:

  • 学生1:类(class)1、类(class)2
  • 学生 2:类(class) 1、类(class) 3、类(class) 5
  • 学生3:类(class)2
  • ...

首先,我需要一个查询来遍历所有学生,然后对于每个学生,我需要查询数据库以了解该学生注册了哪些类(class):

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。这显然是因为两个回调函数都是异步的。我怎样才能克服这个问题并打印如上所示的列表?

非常感谢任何帮助。

最佳答案

您应该能够通过将属性附加到回调函数本身来解决此问题,如下所示:

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

不过,如果我可以通过使用单个查询生成预期结果来避免第二次回调,我会三思而后行。在这种情况下:

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与上一次迭代中的student.id进行比较,以了解何时打印换行符和新学生姓名,从而获得所需的输出格式。

关于javascript - 两个查询,其中第二个查询依赖于第一个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13365988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com