2

我试图在 IndexedDb 添加事务的 onsuccess 回调中有一个函数,但由于某种原因,永远不会调用 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");
            }
        };
    };
};
4

2 回答 2

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");
        }
    };
};
于 2013-05-08T01:12:05.223 回答
0

您是否收到警报“加载按钮上的光标无法打开”?

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

但是,如果实际调用了 onsuccess 侦听requestDataadd器(并且您收到警报),则情况并非如此。

我还看到您没有为请求onerror定义侦听器。openCursor您可能想要更改它以获得更多洞察力。通常,您应该始终定义onerroronsuccess处理程序。

于 2013-05-07T20:13:14.043 回答