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
。
我已经在定义和版本控制的 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
。