我正在尝试在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");
}
};
};
};
答案 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
侦听器。您可能希望更改它以获得更多洞察力。通常,您应始终定义onerror
和onsuccess
处理程序。