SQLite查询中循环的javascript
我已经创建了一个函数,它将从我的数据库返回字符串“path”SQLite查询中循环的javascript,javascript,sqlite,Javascript,Sqlite,我已经创建了一个函数,它将从我的数据库返回字符串“path” function getAudio(mid, cb) { //mid is an array containing the id to some multimedia files. for(i=0; i < mid.length; i++) { db.transaction(function(tx) { tx.executeSql('SELECT * FR
function getAudio(mid, cb) {
//mid is an array containing the id to some multimedia files.
for(i=0; i < mid.length; i++) {
db.transaction(function(tx) {
tx.executeSql('SELECT * FROM Multimedia WHERE Mid=' + mid[i] + ' AND Type=' + 2, [], function(tx, results) {
//type=2 is audio. (type=1 is picture file etc) There is only one audiofile in the array.
if(results.rows.length > 0) {
path = results.rows.item(0).Path;
cb(path);
}
}, errorCB);
}, errorCBQuery);
}//end for
}//end getAudio()
函数getAudio(mid,cb){
//mid是一个数组,包含一些多媒体文件的id。
对于(i=0;i有没有办法解决这个问题?谢谢:)这是经典的闭包问题。是一个异步调用,这意味着您的循环在您传入的函数被触发之前完成。函数具有对
i
变量的持久引用,而不是调用transaction
时该变量的副本。因此,这些函数中的每一个(您在每个循环中生成一个)都会看到i==mid.length
,因此mid[i]
是未定义的
,您的SQL就会出错
您需要做的是让回调关闭另一个变量,该变量在循环进行时不会改变。通常的方法是使用工厂函数:
function getAudio(mid, cb) {
//mid is an array containing the id to some multimedia files.
for(i=0; i < mid.length; i++) {
db.transaction(makeTx(mid[i]), errorCBQuery);
}//end for
function makeTx(val) {
return function(tx) {
tx.executeSql('SELECT * FROM Multimedia WHERE Mid=' + val + ' AND Type=' + 2, [], function(tx, results) {
//type=2 is audio. (type=1 is picture file etc) There is only one audiofile in the array.
if(results.rows.length > 0) {
path = results.rows.item(0).Path;
cb(path);
}
}, errorCB);
};
}
}//end getAudio()
函数getAudio(mid,cb){
//mid是一个数组,包含一些多媒体文件的id。
对于(i=0;imid[I]
传递到makeTx
函数中,该函数返回将传递到事务中的函数。我们返回的函数关闭创建它的makeTx
调用的val
参数,该参数不变
这是对代码的最小重写;你也许可以更进一步。例如,请参阅missingno对重新参数化语句问题的评论
旁注:它看起来不像您在任何地方声明i
或path
。如果这真的是真的,你就成了牺牲品。建议声明它们。lol这只是一个输入错误:p在过去的一个小时里,删除和添加了大量代码。我的错:)@T.J.Crowder好的,谢谢你通知我。编辑:)您应该使用参数化sql,而不是使用字符串连接,以保护自己不受sql注入的影响。考虑到你通过的数组参数,我猜它看起来像是tx.executeSql('SELECT*FROM Multimedia WHERE Mid=?AND Type=?',[Mid[I],2]
@YaqubAhmad:在我获得15分之前,我无法投票。但我在“有用的帖子”中回答了“是”)@TorK:不过,你可以接受答案(如果你觉得可以接受的话)@T.J.Crowder:aah这就是这个符号的意思^^再次感谢,我想我看到你们了;)嗨,克劳德,你能建议我如何解决我的问题吗,链接如下