1

我发现同步数据库查询生成mozIStorageStatementRow而异步代码生成mozIStorageRow

我可以通过一个简单的 Shim 轻松解决这个问题。在同时使用同步和异步调用时,是否有一种更简洁(即比我的 shim 更简洁)的方式来传递数据库查询结果?

示例代码,从 a 开始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");
        }
    });
4

1 回答 1

1

并不是说我不知道​​(过去我读过几次实际的代码)......

两者mozIStorageStatement(不是..Row),mozIStorageRow也实现mozIStorageValueArray了,这有点低级。确保QueryInterface/instanceof根据需要。

除此之外,您必须编写一些包装器或Proxy,就像您已经做过的那样。

旁白:如果可能,您应该避免使用同步 API,以保持主 (UI) 线程的敏捷性。IIRC 甚至有计划(或至少是)从长远来看将其删除。还有一个称为 的高级包装器Sqlite.jsm,尤其是与Task.jsm(页面上的示例Sqlite.jsm)结合使用时。

于 2013-09-16T20:57:46.763 回答