onsuccess和oncomplete回调不适用于indexedDb add transaction

时间:2013-05-07 17:16:55

标签: javascript html5 indexeddb

我正在尝试在foredccess回调中为IndexedDb添加事务提供一个函数,但由于某种原因,永远不会调用onsuccess回调。我基本上尝试将一个电影对象添加到IndexedDb,并在回调中尝试通过迭代游标显示indexedDb中的所有电影。
我希望新增的电影也会显示出来。但回调失败了。以下是我的代码。有人可以让我知道这是什么问题吗?

var movieName=document.getElementById('movieInput').value;
var movieDataToStore = [{ movieid: "5", name: movieName, runtime:"60"}];
var request = indexedDB.open("movies", 1);
request.onsuccess = function(event) {
    db = event.target.result;
    //var transaction = window.db.transaction(["movies"], "readwrite");
    //alert(db.transaction("movies").objectStore("movies").add(null));
    var requestDataadd=window.db.transaction(["movies"],"readwrite").objectStore("movies").add(movieDataToStore[0]);
    requestDataadd.onsuccess = function(event) {
        window.db.transaction("movies").objectStore("movies").openCursor().onsuccess = function(event) {
            var cursor = event.target.result;
            if (cursor) {
                alert("CURSOR: movie: " + cursor.key + " has name " + cursor.value.name);
                cursor.continue();
            } else {//writeLog("CURSOR: No more entries!");
                alert("Cursor at the Load Button unabe to open");
            }
        };
    };
};

2 个答案:

答案 0 :(得分:3)

您正在使用两笔交易。由于第二个事务是在第一个事务完成之前创建的,因此它们都会获得初始状态的快照。

您必须重复使用第一个事务或等到完成后才开始第二个事务。这是重用交易:

var tx = window.db.transaction(["movies"],"readwrite");
var requestDataadd = tx.objectStore("movies").add(movieDataToStore[0]);
requestDataadd.onsuccess = function(event) {
    tx.objectStore("movies").openCursor().onsuccess = function(event) {
        var cursor = event.target.result;
        if (cursor) {
            alert("CURSOR: movie: " + cursor.key + " has name " + cursor.value.name);
            cursor.continue();
        } else {//writeLog("CURSOR: No more entries!");
            alert("Cursor at the Load Button unabe to open");
        }
    };
};

答案 1 :(得分:0)

你是否收到警告"光标在加载按钮上无法打开" ?

乍一看,我认为问题是requestDataadd请求失败,因为您已经(成功)插入了此对象一次,因此您会收到重复的键错误。但是,您没有为onerror请求定义requestDataadd个侦听器。

但是,如果requestDataadd的onsuccess监听器实际被调用(并且您收到警报),则情况可能不是这样。

我也发现您没有为onerror请求定义openCursor侦听器。您可能希望更改它以获得更多洞察力。通常,您应始终定义onerroronsuccess处理程序。