2

我有以下代码,它InvalidStateErrorFirefox中抛出一个(调用时objectStore)。消息是A mutation operation was attempted on a database that did not allow mutations.

奇怪的是,当我将事务的创建放在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 );
    }
}

有人可以向我解释一下,为什么这不起作用?

4

2 回答 2

1

如果 getBlob 是异步函数,这将不起作用:

fileEntry.getBlob( "", function( blob ) {
  var store = transaction.objectStore( STORE_NAME );

因为transaction已经提交,当你得到 blob 时。

于 2013-06-19T05:17:04.517 回答
0

不确定 indexeddb 中是否支持 blob。

于 2013-06-18T18:19:06.890 回答