我的 JS 脚本检查数据库是否有值。如果没有,则会填充数据库。再次触发时,数据库中的值将显示在页面上。当我通过重新加载页面运行脚本两次时,这是有效的。当我将整个事情放在 while 循环中时,它根本不起作用。循环永远运行,因为我猜它无法进入
marmaInfo.onsuccess = function(evt) {
我不确定这是否是范围问题,我只是无法弄清楚,为什么当 while 循环处于活动状态时它的行为有所不同。
var key = $('#marmaID').val();
console.log("key " + key );
store = getObjectStore("marmasStore", 'readwrite');
let i = 0;
//while (i < 1) {
var marmaInfo = store.get(key);
marmaInfo.onsuccess = function(evt) {
var req = store.openCursor(key);
var record = evt.target.result;
console.log("record:", record);
req.onsuccess = function(e) {
var cursor = e.target.result;
if (cursor !== null) { // key already exist
console.log(key + " FOUND");
console.log("load and display values of " + key);
data = marmaInfo.result
//build page
// Marma information
document.getElementById("headline").innerHTML = data.sanskrit;
console.log("display values of " + key + " DONE");
i++;
} else { // key not exist
console.log(key + " NOT FOUND");
console.log("initial filling DB ...");
initialMarmaData.forEach((marma) => {
var request = store.put(marma);
request.onsuccess = (event) => {
console.log(event.target.result + " initial filling DB DONE");
};
//return;
});
//store.add(obj)
}
};
};
marmaInfo.onerror = function(evt) {
console.log("error");
i++;
}
//}
@Barmar 有正确的想法,它适用于递归。非常感谢@Barmar
这是带有递归的代码:
let i = null;
function recurse() {
i++;
console.log("loop " + i);
var key = $('#marmaID').val();
console.log("key " + key );
store = getObjectStore("marmasStore", 'readwrite');
var marmaInfo = store.get(key);
marmaInfo.onsuccess = function(evt) {
var req = store.openCursor(key);
var record = evt.target.result;
req.onsuccess = function(e) {
var cursor = e.target.result;
if (cursor !== null) { // key already exist
console.log(key + " FOUND");
data = marmaInfo.result
//build page
document.getElementById("headline").innerHTML = data.sanskrit;
console.log("display values of " + key + " DONE");
} else { // key not exist
console.log(key + " NOT FOUND");
console.log("initial filling DB ...");
initialMarmaData.forEach((marma) => {
var request = store.put(marma);
request.onsuccess = (event) => {
console.log(event.target.result + " initial filling DB DONE");
};
});
if (i > 2) {
return;//this is just for savety
}
recurse()
}
};
};
marmaInfo.onerror = function(evt) {
console.log("error");
return;
}
};
//}
recurse()