在一个不允许突变的数据库上尝试进行突变操作



我有两个db。我想清空DB,添加新的内容。我正在使用以下方法。

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次。例如
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中执行此操作时,当执行db.saveChanges()不止一次时,我得到InvalidStateError: A mutation operation was attempted on a database that did not allow mutations.。这是代码问题吗?

你的名字是误导,当你调用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;
     });
 }

相关内容

  • 没有找到相关文章

最新更新