1

编辑:由于某种原因,我什至无法理解,代码现在可以工作了!我不知道为什么会这样。

我在 PhoneGap 项目中使用IndexedDB 垫片。我编写了一些似乎在 Chrome 中完美运行的代码,但是当我尝试在 Android 4.0 和 4.2 中执行相同的代码时,它崩溃了。这是罪魁祸首:

deleteAll : function(table) {
    var deferred = $q.defer();
    var dbOpenPromise = $.indexedDB(DB_NAME, {"version" : DB_VERSION});

    dbOpenPromise.done(function(db, event){
        var objectStore = $.indexedDB(DB_NAME).objectStore(table);
        var promise = objectStore.clear();
        promise.done(function(result, event){
            deferred.resolve();
        });
        promise.fail(function(error, event) {
            deferred.reject();
        });
    });

    dbOpenPromise.fail(function(db, event) {
        deferred.reject();
    });
    return deferred.promise;
},

当我尝试执行该操作时(有时可能发生在已经为空的表中),polyfill 崩溃。我将问题追踪到这一行:

function throwDOMException(name, message, error) {
    var e = new DOMException.prototype.constructor(0, message);

Android一直在抱怨一个非法的构造函数,所以我把它改成了这样:

function throwDOMException(name, message, error) {
    var e = new DOMException.constructor(0, message);

有了这个,它现在可以不受阻碍地抛出异常。在第 1049 和 1057 行抛出了异常:

if (value) {
    try {
        var primaryKey = eval("value['" + props.keyPath + "']");
        if (!primaryKey) {
            if (props.autoInc === "true") {
                getNextAutoIncKey();
            }
            else {
                // here
                idbModules.util.throwDOMException(0, "Data Error - Could not eval key from keyPath");
            }
        }
        else {
            callback(primaryKey);
        }
    } 
    catch (e) {
        // and here
        idbModules.util.throwDOMException(0, "Data Error - Could not eval key from keyPath", e);
    }
}

什么可能导致此崩溃?难道我做错了什么?

(更多信息,以防万一有用:我没有做任何特别的事情来初始化 shim,除了在加载 PhoneGap 主文件之后和加载所有应用程序脚本之前立即加载它。我需要做一些特别的事情吗?)

4

0 回答 0