在JS中嵌套时——“while循环”变量不再被定义

问题描述 投票:0回答:1

我的 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++;    
    }
//}

javascript while-loop indexeddb
1个回答
0
投票

@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()

© www.soinside.com 2019 - 2024. All rights reserved.