我使用以下代码从Web sql数据库中获取分层数据:
... function getResult(query,data,callback){ db.transaction(function(tx) { tx.executesql(query,function(tx,result) { callback(result); }); }); } function findChildren(id){ getResult("SELECT * FROM my_table WHERE parent_id=?",[id],function(result){ for (var i = 0,item = null; i < result.rows.length; i++) { item = result.rows.item(i); data.push(item); findChildren(item.id); } }); } var data = Array(); getResult("SELECT * FROM my_table WHERE name like ?",["A"],function(result){ for (var i = 0,item = null; i < result.rows.length; i++) { item = result.rows.item(i); data.push(item); findChildren(item.id); } }); ...
如何检测执行是否已完成?
解决方法
使用findChildren的回调和打开事务的计数器:
function findChildren(id,callback){ getResult("SELECT * FROM my_table WHERE parent_id=?",function(result){ var results = [],results.finished = 0; len = result.rows.length; for (var i = 0; i < len; i++) (function(i) { var item = result.rows.item(i); ... ... findChildren(item.id,function(result) { results[i] = result; if (++results.finished == len) callback(results); }); })(i); }); } getResult("SELECT * FROM my_table WHERE name like ?",function(result){ var results = [],results.finished = 0,len = result.rows.length; for (var i = 0; i < len; i++) (function(i) { var item = result.rows.item(i); ... ... findChildren(item.id,function(result) { results[i] = result; if (++results.finished == len) { // now results contains a nice tree of arrays with children ids // do something with it } }); })(i); });