IndexedDB:后续交易中的错误

时间:2015-07-02 15:33:47

标签: indexeddb

我包含了在数据库中创建4个objectStore的说明,但程序在创建第一个后停止。

为了克服这个问题,我在每个创建结束时放了一个alert(...),并且,通过这个中断,一切都可以正常运行。

有没有办法让一切工作,而不插入这些休息?

即使我读取了4个ObjectStore的记录数,我发现这个问题,所以我总是在每条指令后放alert(...)

我也尝试过使用' onsuccess'和' onerror',但我总是有错误。

...

我终于解决了使用jQuery' Promise'这对于解决异步Javascript和IndexedDB的问题至关重要。 这是工作代码:

function getRecordsCountDeferred_1(tableName) {
    var defer = $.Deferred();
    var req,objectStore;
    objectStore=db.transaction([tableName],"readonly").objectStore(tableName);

    req=objectStore.count();
    req.onsuccess = function(e) {
        var result = e.target.result;
        defer.resolve({'count':result,'mess':tableName+' '+result+' records'});
    };
    req.onerror = function(event) {
       alert('Errore');     
    };
    return defer.promise(); 
}

function getRecordsCountDeferred(tableName) {
    var myPromise = getRecordsCountDeferred_1(tableName);

    $.when(myPromise).done(function(data){
        var mess=$('#info-span').html()+"&nbsp;"+tableName+": records count: "+data.count+"<br>";
        $('#info-span').html(mess);
    }).fail(function(data){
        alert("Errore");
    });
}

3 个答案:

答案 0 :(得分:0)

我确信它与4 objectStore无关。它必须是最后一次数据库请求结果错误并自动中止事务。

如果您想继续中止的交易,可以在event.preventDefault()回拨时拨打onerror

答案 1 :(得分:0)

代码:

function infoDB(force) {
    if (!force) return;
    var count, tableName;
    var mess = 'Info sul database locale ' +
        db.name + ' - Versione ' + db.version + ':<br>';
    for (i = 0; i < db.objectStoreNames.length; i++) {
        tableName = db.objectStoreNames[i]
        count = getRecordsCount(tableName);
        mess += (i + 1) + ') ' + tableName + ' (' + count + ')<br>';
    }
    $("#info-span").html(mess);
}
function getRecordsCount(tableName) {
    var req, objectStore;
    objectStore = db.transaction([tableName], "readonly").objectStore(tableName);
    req = objectStore.count();
    count = -1;
    if (req != null) {
       alert("getRecordsCount\n" + req + " - " + tableName);
       count = req.result;
    }
    return count;
}

答案 2 :(得分:0)

如果我注释掉这条线:     //     // alert('getRecordsCount \ n'+ req +“ - ”+ tableName);     // 函数InfoDB没有返回任何内容,在控制台firebug中出现此错误:

// InvalidStateError: An attempt was made to use an object that is not,
// or is no // longer, usable
//
// count=req.result;