1

我有 2 个数据库。我想清除数据库并添加新内容。我正在使用以下方法。

function updateDB(db, dbInstance, newElements) {
    return dbInstance.forEach(function(oldElement) {
        dbInstance.remove(oldElement);
    }).then(function() {
        console.log('Deleted all rows');
        return db.saveChanges(function() {
            dbInstance.addMany(newElements);
            return db.saveChanges(function(){
                console.log('Added '+newElements.length+' rows');
                return true;
            });
        });
    });
}

从技术上讲,我调用了上述方法 2 次。IE

return updateDB(db1, db1.dbIns1, newElements1).then(function() {
    return updateDB(db2, db2.dbIns2, newElements2).then(function() {
        return true;
    });
});

该方法的定义如下。这是在加载时完成的,并且调用了 onready 方法:

   $data.Entity.extend("Db1Name", {
            Id: { type: "string", key: true},
            Name: { type: "string"},
                Values : {type: "string"}
    });

   $data.EntityContext.extend("db1Test", {
                db1Ins: { type: $data.EntitySet, elementType: Db1Name }
   });

   var db1 = new db1Test({ name: "indexedDb", databaseName: "db1Ins" });

在 Firefox 中执行此操作时,我InvalidStateError: A mutation operation was attempted on a database that did not allow mutations.会多次执行 db.saveChanges() 。这是代码问题吗?它在 Chrome 中运行良好。

4

1 回答 1

0

您的名称具有误导性,当您调用 db1 是一个实例时,db1Ins 是一个实体集,Db1Name 是一个实体类型。在函数中,参数名称也很糟糕:db 是一个上下文,dbInstance 是一个实体集。我建议你使用好名字。

我不喜欢混合回调和承诺链,所以让我们重写它:

 function updateDB(ctx, set, newElements) {
    return set.toArray()
    .then(function(oldElements) {
        oldElements.forEach(function(oldElement) {
            set.remove(oldElement);
        };
        console.log('Deleted all rows');
        return ctx.saveChanges();
    })
    .then(function() {
        set.addMany(newElements);
        return ctx.saveChanges();
    })
    .then(function(l){
         console.log('Added '+l+' rows');
         return true;
     });
 }
于 2013-04-19T15:12:20.740 回答