Javascript InvalidStateError“;试图对不允许突变的数据库执行突变操作。”;在Firefox的indexedDB中
我有以下代码,在Firefox中抛出一个Javascript InvalidStateError“;试图对不允许突变的数据库执行突变操作。”;在Firefox的indexedDB中,javascript,firefox,indexeddb,Javascript,Firefox,Indexeddb,我有以下代码,在Firefox中抛出一个InvalidStateError(调用objectStore时)。 消息是在不允许突变的数据库上尝试了突变操作。 奇怪的是,当我将事务的创建放在getBlob回调中时,它似乎可以工作 function saveFile( fileEntry ) { var transaction = this; transaction.onerror = function( event ) { console.log( event );
InvalidStateError
(调用objectStore
时)。
消息是在不允许突变的数据库上尝试了突变操作。
奇怪的是,当我将事务的创建放在getBlob
回调中时,它似乎可以工作
function saveFile( fileEntry ) {
var transaction = this;
transaction.onerror = function( event ) {
console.log( event );
};
fileEntry.getBlob( "", function( blob ) {
var store = transaction.objectStore( STORE_NAME );
try {
var request = store.put( blob, fileEntry.getFullname() );
request.onsuccess = function( event ) {
console.log( "file: " + fileEntry.getFullname() );
++(progressBar[0].value);
};
request.onerror = function( event ) {
console.log( "error in file " + event );
++(progressBar[0].value);
};
} catch( ex ) {
console.log("getBlob " + ex );
}
}, function() {
}, true );
}
function saveRecursive( dirEntry, missingFiles ) {
var db = this;
var transaction = db.transaction( [STORE_NAME],
MODES.READ_WRITE );
for( var i in dirEntry.children ) {
var entry = dirEntry.children[i];
if( entry.directory ) {
createDirectory( dirEntry, entry );
saveRecursive.call( db, entry, missingFiles );
continue;
}
var index = missingFiles.indexOf( entry.getFullname() );
if( index == -1 )
continue;
// Still missing - add
missingFiles.splice( index, 1 );
saveFile.call( transaction, entry );
}
}
有人能给我解释一下为什么这不起作用吗?不确定indexeddb中是否支持blob。如果getBlob是异步函数,这将不起作用:
fileEntry.getBlob( "", function( blob ) {
var store = transaction.objectStore( STORE_NAME );
因为
事务
已经提交,当您获得blob时。事务会在indexedDB API中自动提交,并且它们不会构建为保持打开状态,而是在非活动状态时自动提交