Nai*_*aim 13 javascript sqlite synchronization web-sql
我工作的一个JavaScript代码与客户端SQLite数据库进行交互的,通过新望window.openDatabase(...),database.transaction(...)和相关的API.正如大多数人所知,当你以这种方式执行查询时,它是一个异步调用,这通常很好.您可以根据回调进行调用并处理结果.
在我目前的情况下,我正在为一个客户端工作,该客户端在本地存储的数据库中执行某些层次结构.我遇到麻烦的算法部分需要从某一行开始,该行有一个"父"(由id)引用,这是表中的另一行.我必须继续走这棵树直到我到达根部.
问题是,我不知道如何使用带回调的异步样式查询来继续提供循环父ID.理想情况下,我可以阻止查询,以便我可以在循环中完成所有操作.这是我当前设置的关键部分:
for (i in search.searchResults.resultsArray)
{
hierarchyArr = new Array();
pageHierarchyArr = new Array();
id = search.searchResults.resultsArray[i].ID;
while (id != null && id != "")
{
var hierarchySql = "SELECT ID, parentID, type, content FROM content WHERE ID = " + id;
// This is a prettied up call to database.transaction(...)
var rs = db.getRS(hierarchySql);
// Ideally the code below doesn't execute until rs is populated
hierarchyArr.push(rs[0]);
if (rs[0].type == "page")
{
pageHierarchyArr.push(rs[0]);
// Do some additional work
}
id = rs[0].parentID;
}
}
Run Code Online (Sandbox Code Playgroud)
正如您可能想象的那样,它不能很好地工作.hierarchyArr将"undefined"推入其中,然后在尝试检查rs [0]的类型时脚本崩溃.
当我尝试使用回调设置它(db.getRSAndCallback(sql, callbackFunc)我用于早期的,非相互依赖的查询就好了)时更糟糕的是:内部循环像疯了一样起飞,因为id没有得到更新; 大概是因为循环使JavaScript解释器保持忙碌而从未真正填满rs.在一些人工测试中,我在几次迭代后强制内部循环中断,所有回调在循环结束后开始全部通过.
http://dev.w3.org/html5/webdatabase/#synchronous-database-api上的"标准"(例如它现在)似乎表明存在同步API,但我还没有看到任何在任何基于WebKit的浏览器上签名.
任何人都可以就我的方式提出建议,a.使用回调或b来正确地制定这些迭代的,相互依赖的查询.以某种方式使调用实际上以同步或明显同步的方式发生.
非常感谢任何对这个看似棘手的小问题采取行动的人.
纳伊姆
PS这是客户端的实现db.getRS参考:
.
.
.
getRS: function(sql)
{
var output = [];
db.database.transaction(function(tx)
{
tx.executeSql(sql, [], function(tx,rs)
{
for(i = 0; i < rs.rows.length; i++)
{
output.push(rs.rows.item(i));
}
},
function(tx, error) { ... }
)});
return output;
},
.
.
.
Run Code Online (Sandbox Code Playgroud)
我使用回调和闭包来解决类似的问题,考虑:
function getFolder(id, callback) {
var data = [];
ldb.transaction(function (tx) {
tx.executeSql('SELECT * FROM folders where id=?',
[id],
function (tx, results) {
if (results.rows && results.rows.length) {
for (i = 0; i < results.rows.length; i++) {
data.push(results.rows.item(i));
}
}
if (typeof(callback) == 'function')
callback(data);
},
function (tx, error) {
console.log(error);
});
});
}
Run Code Online (Sandbox Code Playgroud)
在此示例的继续中,文件夹具有属性父级,用于定义它与其他文件夹的关系.和文件一样.以下将使用闭包(成功)获取文档的路径:
function getDocPath(doc, callback) {
var path = [];
var parent = doc.parent;
var success = function(folder) {
var folder = folder[0];
parent = folder.parent;
path.push({'id':folder.id,'name':folder.name});
if (parent != "undefined")
getFolder(parent, success);
else
if ( typeof(callback) == 'function' ) callback(path.reverse());
}
getFolder(parent, success);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12779 次 |
| 最近记录: |