onsuccess和oncomplete回调对indexedDb add事务不起作用

onsuccess and oncomplete call back is not working for indexedDb add transaction

本文关键字:add 事务 不起作用 indexedDb oncomplete 回调 onsuccess      更新时间:2023-09-26

我试图在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");
            }
        };
    };
};

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

您必须重用第一个事务或等到它完成后再启动第二个事务。下面是重用事务:

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

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

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

但是,如果实际上调用了requestDataadd的onsuccess侦听器(并且您得到一个警报),则不可能出现这种情况。

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