Loops IndexedDb动态填充现有对象存储

Loops IndexedDb动态填充现有对象存储,loops,count,indexeddb,Loops,Count,Indexeddb,我已经在一个已定义和版本化的IndexedDB模式中创建了许多对象存储,比如说三个对象存储 我需要填充它们。为此,我创建了一个对象,该对象存储两个名称端点(从中获取要填充的数据)。 另外,为了避免填充已填充的对象存储时出错,我使用count()方法。。。objectstore中的count键,如果有0键,则填充,否则读取 如果我一个接一个地执行,也就是说,不使用循环,而是声明并执行三个ObjectStore中的每一个,那么它工作得非常完美 但是,当调用函数来填充循环中的每个存储时,对于最后两个要

我已经在一个已定义和版本化的IndexedDB模式中创建了许多对象存储,比如说三个对象存储

我需要填充它们。为此,我创建了一个对象,该对象存储两个名称端点(从中获取要填充的数据)。 另外,为了避免填充已填充的对象存储时出错,我使用
count()
方法。。。objectstore中的count键,如果有0键,则填充,否则读取

如果我一个接一个地执行,也就是说,不使用循环,而是声明并执行三个ObjectStore中的每一个,那么它工作得非常完美

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

未能从“IDBRequest”中读取“result”属性:请求失败 还没有完成。at IDBREST.counts.(匿名函数).onsuccess

代码如下:

//对象包含项目存储和端点。
常数存储=[
{osName:'user-1',osEndPoint:'/api/1,
{osName:'user-2',osEndPoint:'/api/2},
{osName:'user-3',osEndPoint:'/api/3}
]; 
//打开数据库。
var request=indexedDB.open(DB\u名称,DB\u版本);
//为了动态创建变量,实例化两个数组。
var-tx=[];
var计数=[];
风险价值总额=[];
//onsuccess回调。
request.onsuccess=函数(e){
db=这个结果;
对于(商店中的k){
tx[k]=db.transaction(存储[k].osName).objectStore(存储[k].osName);
计数[k]=tx[i]。计数();
计数[k]。onsuccess=函数(e){
总[k]=e.target.result;
//如果计数结果等于0,则通过调用执行此操作的函数进行填充。
如果(总[k]==0){
fetchGet2(存储[k].osEndPoint,popTable,存储[k].osName)//
}否则{
readData(数据库名称,数据库版本,存储[0].osName);
} 
};
}//为循环关闭
};//关闭request.onsuccess。
fetchGet2
函数在循环(例如用于创建objectstores的循环)中运行良好,并且已经逐个进行了测试

这看起来像是一个异步问题,但是我不知道如何解决这个问题,即能够动态填充现有的ObjectStore,避免填充已填充的ObjectSor而只填充空的ObjectSor

事实上,测试没有计数问题,但是在循环内工作得很完美,或者使用计数但没有循环

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


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

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

在不使用count函数的情况下迭代循环,它工作得很好问题是计数()。谢谢@Josh的启发!这里提供了一个很好的简单有效的循环示例:您没有在代码中的任何其他地方使用变量
i
?正如所写的,这是使用一个全局
i
变量。例如,如果
fetchGet2
使用
i
,则
i
可能会递增并因此,在<代码>计数[i] < /代码>中的请求并不是刚刚启动成功事件。请考虑在OnWrand处理程序中记录日志。也可以考虑使用<代码>计数[I]。===e.target.result否则,这里显示的逻辑看起来很好。@JoshuaBell,我已经测试了更改k的I变量,确实意识到名称空间中其他地方没有I,并且还使用计数[k]进行了测试。onsucceed=函数(e){}但是我得到了相同的结果:只执行对象的las元素,当记录值和对象名称时,只记录最后一个元素。