是否有一种干净的方法来混合异步和同步数据库查询处理?

时间:2013-09-16 20:28:32

标签: javascript firefox-addon

我发现同步数据库查询生成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");
        }
    });

1 个答案:

答案 0 :(得分:1)

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

mozIStorageStatement(不是..Row)和mozIStorageRow都会实现mozIStorageValueArray,这更低级。请务必根据需要QueryInterface / instanceof

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

除了:如果可能的话,你应该避免使用同步API,以保持主(UI)线程的活泼。 IIRC甚至有计划(或至少是)从长远来看将其删除。还有一个名为Sqlite.jsm的高级包装器,特别是与Task.jsm一起使用时(Sqlite.jsm页面上的示例)。