IndexedDb动态填充现有的ObjectStores

时间:2017-02-13 02:22:35

标签: loops count indexeddb

我创建了许多,比如在已定义和版本化的IndexedDB架构中有三个ObjectStore。

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

如果我逐个执行,那就是完美的,而不是使用循环,声明并执行三个对象库中的每一个。

但是,当调用函数来填充循环中的每个存储时,我得到以下错误消息,要填充最后两个对象库:

  

无法从'IDBRequest'读取'result'属性:请求   还没完呢。在IDBRequest.counts。(匿名函数).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进行编码,而且我对使用任何框架都不感兴趣。

1 个答案:

答案 0 :(得分:2)

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