IndexedDb 动态填充现有的 ObjectStore

IndexedDb dynamically populating existing ObjectStores

我已经在定义和版本控制的 IndexedDB 模式中创建了很多,比方说三个 ObjectStore。

我需要填充所有这些。为此,我创建了一个对象,它存储两个名称端点(它获取要填充的数据)。 另外,为了避免在尝试填充已填充的对象存储时出错,我使用 count() 方法来...计算对象存储内的键,如果有 0 个键,则填充,否则读取。

如果我在一个一个的基础上执行,它会完美地工作,而不是使用循环,声明并执行三个对象存储中的每一个。

然而,当调用函数来填充循环内的每个存储时,我收到以下关于要填充的最后两个对象存储的错误消息:

Failed to read the 'result' property from 'IDBRequest': The request has not finished. at IDBRequest.counts.(anonymous function).onsuccess

代码如下:

 // object contains oject stores and endpoints.
 const stores = [
 {osName:'user-1', osEndPoint:'/api/1,
 {osName:'user-2', osEndPoint:'/api/2},
 {osName:'user-3', osEndPoint:'/api/3}
 ]; 

 // open db.
 var request = indexedDB.open(DB_NAME, DB_VERSION);

 // in order to dynamically create vars, instantiate two arrays.
 var tx = [];
 var counts = [];
 var total = [];

 // onsuccess callback.
 request.onsuccess = function (e) {
    db = this.result;
    for(k in stores) {
      tx[k] = db.transaction(stores[k].osName).objectStore(stores[k].osName);
      counts[k] = tx[i].count();
      counts[k].onsuccess = function(e) {
        total[k] = e.target.result;

     // if the counting result equals 0,  then populate by calling a function that does so.
      if (total[k] == 0) {                 
          fetchGet2(stores[k].osEndPoint, popTable, stores[k].osName); //
       } else { 
           readData(DB_NAME, DB_VERSION, stores[0].osName);
           } 
        };
         }   // closes for loop
     }; // closes request.onsuccess.

fetchGet2 函数在循环内运行良好,例如用于创建对象存储的循环,并且也已经过一一测试。

这看起来像是一个异步问题,但是我想不出如何解决这个问题,即能够动态填充现有的对象存储,避免填充已填充的对象存储并且只填充空对象存储。

确实在没有计数问题的情况下进行了测试,但循环内部工作完美,或者有计数但没有循环。

目前和当记录计数[k]时,它只记录对象最后一个成员的数据。

提前致谢,我正在使用 vanilla js 进行编码,我对使用任何框架都不感兴趣。

是的,这看起来像是异步问题。 For 循环同步迭代。尝试编写一个循环,在每个请求完成之前不会前进 i