我遇到一些代码没有达到预期效果的问题,我应该首先解释它在做什么:
在文档加载函数上,selectForLists正在查询sqlite DB 包含足球比分,特别是一个叫做比赛的桌子 调用函数renderLists。
RenderLists将游戏团队放入带有重复项的排序列表中 除去。
然后对于这个团队列表中的每个条目,函数latestTest是 被调用,它从匹配表中选择所有行 团队正在玩并调用latestTest2。
LatestTest2计算该团队正在播放的行数 输出一些代码到插入的div。
一旦完成每个团队,它应该恢复 完成renderLists函数并调用加载的函数,除了 它没有,我必须添加延迟来调用此函数,因为 它最后没有发生。
我希望有人可以告诉我这里有什么问题,为什么在完成上述所有操作后都没有调用加载的函数?此外,如果任何人有任何提示,以更高效的代码实现相同的结果,我非常希望。
为这篇长篇文章道歉,我相信很多人会发现代码很糟糕,我知道有太多的功能,可能还有很多更好的方法可以做到这一点,但是自从我在大学工作时使用javascript已经有几年了。我正在与它和sqlite挣扎。
代码低于或http://pastebin.com/7AxXzHNB谢谢
function selectForLists() { //called on (document).ready
db.transaction(function(tx) {
tx.executeSql('SELECT * FROM matches', [], renderLists);
});
}
function renderLists(tx, rs) {
var playingList = new Array();
for (var i = 0; i < rs.rows.length; i++) {
playingList.push(rs.rows.item(i)['playing']);
}
playingListSort = playingList.sort();
var playingListFinal = new Array();
playingListSort.forEach(function(value) {
if (playingListFinal.indexOf(value) == -1) {
playingListFinal.push(value);
}
});
for (var c = 0; c < playingListFinal.length; c++) {
latestTest(playingListFinal[c]);
}
loaded(); //not running last in the function
//setTimeout(loaded,1000);
/////Using a delay because it doesn't run after the above has completed
}
function latestTest(team) {
db.transaction(function(tx) {
tx.executeSql('SELECT * FROM matches WHERE playing="' + team + '"', [], latestTest2);
});
}
function latestTest2(tx, rs) {
counted = rs.rows.length;
var theFunction = rs.rows.item(0)['playing'];
$('#inserted').append('<li onclick="onToDate(\'' + theFunction + '\')"><img width="30px" height="25px" id="popupContactClose" src="style/soccer.png"><div id="popupContactClose2">' + counted + '</div></img>' + rs.rows.item(0)['playing'] + '</li>');
}
答案 0 :(得分:3)
db.transaction
和tx.executeSql
都是异步函数,就像setTimeout
一样,如果你写的话
setTimeout(function(){
doLater();
}, 1000)
doNow();
doNow()
将在 doLater()
之前执行,因为您创建的回调函数将在以后某个时间被调用。
在您的情况下,latestTest()
调用db.transaction
,然后调用tx.executeSql
,这两者都是异步的。这意味着,回调函数latestTest2
将在未来的某个时间被调用,当loaded()
被调用时将
答案 1 :(得分:2)
latestTest
函数使用自己的回调调用另一个executeSQL
函数。 当SQL完成时将执行回调,这将在任意时间执行。
renderLists
函数将继续正常执行(包括调用loaded
函数),与正在执行的latestTests
中的回调有关。
您的错误是认为loaded
将“等待”执行 - 您仍然会在latestTest
中的数据库代码中进行待处理的回调。