【问题标题】:Get multiple table items at the same time in IndexedDBIndexedDB中同时获取多个表项
【发布时间】:2017-10-16 04:10:39
【问题描述】:

在 indexedDB 中,我创建了一个具有多个动态对象存储的数据库 从哪里我可以从单个表中获取项目,但是当尝试使用循环从所有表中获取所有数据时,它只显示最后一个表数据,错误消息 objectStore is not specified for previous table. 可能有任何简单的解决方案,但我无法得到它由于新的 indexedDB。 以下是我的功能:

function displayData(store) {

    for(i = 0; i < TotalModule; i++) {
    ModuleCode= $("#MC_"+i).val();
     storeName = 'tableName_'+ModuleCode;
     DbStoreName .push(storeName );
    }
   DbStore = "'" + DbStoreName .join("','") + "'";

   if (typeof DbStore == 'undefined')

     tx = db.transaction(DbStore, 'readwrite');  //['tab1','tab2','tab3']

        $.each(DbStoreName , function(i) {
            STORE_NAME = DbStoreName [i];
            var ob = 'ob'+i;
            ob = tx.objectStore(STORE_NAME);
      });

}

view Image.

【问题讨论】:

    标签: indexeddb


    【解决方案1】:

    听起来您正试图在同步 for 循环中调用异步函数。在使用 indexedDB 之前,您应该对编写异步 Javascript 非常熟悉。

    也就是说,试试下面的伪代码。我选择使用 Promise。

    function load_store(store) {
      return new Promise(function(resolve, reject) {
        var request = store.getAll();
        request.onsuccess = () => resolve(request.result);
        request.onerror = () => reject(request.error);
      });
    }
    
    function load_stores(db, names) {
      var tx = db.transaction(names, 'readonly');
      var stores = names.map((name) => tx.objectStore(name));
      var load_store_promises = stores.map(load_store);
      return Promise.all(load_store_promises);
    }
    
    function displayData() {
      var names = ...;
      var db ...;
      load_stores(db, names).then(function(array_of_arrays) {
        console.log('data:', array_of_arrays);
      }).catch(function(error) {
        console.log('loading error', error);
      });
    }
    

    【讨论】:

    • 伟大的解决方案它的工作完美。非常感谢你.. @Josh
    猜你喜欢
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多