我发现同步数据库查询生成mozIStorageStatementRow
而异步代码生成mozIStorageRow
。
我可以通过简单的Shim轻松解决这个问题。在处理混合的同步和异步调用时,是否有更干净的方式(即比我的垫片更清洁)传递数据库查询结果?
示例代码,从mozIStorageStatement
开始(例如,通过调用createStatement()
):
//Sync Example:
myStorageStatement.executeStep();
var row = myStorageStatement.row;
var myNameColumn = row.name;
//Sync Shim Example:
myStorageStatement.executeStep();
var row = {
getResultByName: function (str) {
return myStorageStatement.row[str];
}
};
var myNameColumn = row.getResultByName("name");
//ASync Example:
myStorageStatement.executeAsync({
//...
handleResult: function (aResultSet) {
var row = aResultSet.getNextRow();
var myNameColumn = row.getResultByName("name");
}
});
答案 0 :(得分:1)
不是我知道了(我过去几次读过实际的代码)......
mozIStorageStatement
(不是..Row
)和mozIStorageRow
都会实现mozIStorageValueArray
,这更低级。请务必根据需要QueryInterface
/ instanceof
。
除此之外,你必须写一些包装器或Proxy,就像你已经做过的那样。
除了:如果可能的话,你应该避免使用同步API,以保持主(UI)线程的活泼。 IIRC甚至有计划(或至少是)从长远来看将其删除。还有一个名为Sqlite.jsm
的高级包装器,特别是与Task.jsm
一起使用时(Sqlite.jsm
页面上的示例)。