我创建了许多,比如在已定义和版本化的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进行编码,而且我对使用任何框架都不感兴趣。
答案 0 :(得分:2)
是的,这看起来像是异步问题。 For循环同步迭代。尝试编写一个不会提前i
的循环,直到每个请求完成。