编辑:由于某种原因,我什至无法理解,代码现在可以工作了!我不知道为什么会这样。
我在 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 主文件之后和加载所有应用程序脚本之前立即加载它。我需要做一些特别的事情吗?)