Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript InvalidStateError“;试图对不允许突变的数据库执行突变操作。”;在Firefox的indexedDB中_Javascript_Firefox_Indexeddb - Fatal编程技术网

Javascript InvalidStateError“;试图对不允许突变的数据库执行突变操作。”;在Firefox的indexedDB中

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 );

我有以下代码,在Firefox中抛出一个
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中自动提交,并且它们不会构建为保持打开状态,而是在非活动状态时自动提交