2017-10-16 26 views
0

indexedDBでは複数の動的オブジェクトストアを持つ1つのデータベースを作成します。 ここからは単一のテーブルからアイテムを取得できますが、最後のテーブルのみをループしてすべてのテーブルからすべてのデータを取得しようとしますエラーメッセージobjectStoreを持つデータは、前のテーブルでは指定されていません。簡単な解決策があるだけかもしれません。あなたがループするための同期中に非同期関数を呼び出すようにしようとしているよう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.

答えて

0

はサウンド: 以下は私の関数です。 indexedDBを使用する前に、非同期Javascriptの作成に精通している必要があります。

しかし、次のような疑似コードを試してみてください。私は約束を使うことを選んだ。

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); 
    }); 
} 
+0

素晴らしいソリューションそれは完璧な作業です。ありがとうございました.. @Josh – kks

関連する問題