- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个广泛使用IndexedDB的应用程序。我想要做的是保存 employees 表和 company 表的数据。
每个员工都属于一个公司,并且在员工对象 I 中've 公司 ID
和两个实体的对象将如下所示。
公司目标:
{"id":1,"name":"ABC"}
员工对象:
{"id":100,"name":"E1","company_id":1}
我使用自动递增键(称为appid
)保存公司的详细信息,所以我的公司的最终对象如下所示:
{"id":1,"name":"ABC","appid":1}
当我一条一条插入公司记录时,appid 会自动递增。
现在,在插入员工对象时,我想找到公司的 localid(appid
) 并将其保存在员工对象中,以使员工对象看起来像:
{"id":100,"name":"E1","company_id":1,"company_app_id":1}
<小时/>
我可以通过调用方法来获取公司的 localid,同时保存员工的详细信息,例如:
var transaction = db.transaction(['employees'], 'readwrite');
var objStore = transaction.objectStore('employees');
var company_id=employeeobject.company_id;
companyDB.getCompanyById(company_id,function(companyObject){
transaction = db.transaction(['employees'], 'readwrite');
objStore = transaction.objectStore('employees');
// If I comment above two lines it throws me exception.
var request=objStore.put(employeeobject);
request.onsuccess = function (e) {
// using it for next insertion.
};
});
上述代码的问题是每次我想在表中插入员工数据时,我都需要在回调函数中重新打开事务,因为如果我不再次打开事务,它会抛出TransactionInactiveError。
我搜索了 SO 上的特定错误,发现事务一旦在当前范围内不再使用,就会变得不活动。
Above code work perfectly fine when I've couple of employee's objects. But When I'm trying to execute the same code with ~1K of data it takes (normal execution time x ~10).
我所说的正常执行时间是指不获取公司的 localid 并直接保存员工的详细信息。
<小时/>所以我的问题是,以最少的执行时间插入员工数据(包括公司的 localid)的最佳方法是什么?还是我做错了什么?
最佳答案
这取决于您如何实现 companyDB.getCompanyById()
。
如前所述,它是一个异步黑匣子(也许它正在执行网络请求?)正如您所发现的,索引数据库事务仅在 (1) 创建后立即处于事件状态,以及 (2) 在该事务中发出的请求的回调中处于事件状态事务,直到“控制返回到事件循环”。如果没有更多详细信息,最好的选择是批处理工作 - 对 N 名员工执行 getCompanyById() 查找,然后写入这 N 条记录。
但是从顶部的描述“...员工表和公司表的数据...”也许这一切都在单个索引数据库中,在这种情况下,只需对所有内容使用单个事务:
var tx = db.transaction(['companies', 'employees'], 'readwrite');
employee_records.forEach(function(record) {
var company_id = record.company_id;
var req = tx.objectStore('companies').get(company_id);
req.onsuccess = function() {
var company = req.result;
record.company_app_id = company.app_id;
tx.objectStore('employees').put(record);
};
});
(我在这里破坏了你的实际数据/逻辑,这只是为了说明)
关于javascript - 在回调中恢复 IDBTransaction 会抛出 TransactionInactiveError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37968342/
我正在开发一个广泛使用IndexedDB的应用程序。我想要做的是保存 employees 表和 company 表的数据。 每个员工都属于一个公司,并且在员工对象 I 中've 公司 ID 和两个实体
我不知道我是否做错了什么,或者我是否只是把事情逼得太紧。 我正在尝试将大约 70000 条记录从我的在线数据库同步到 IndexedDB与 EventSource 结合和一个Worker 。 因此,我
这似乎是 Safari 唯一的错误。据我所知,它不会出现在 Chrome 中。我有一个非常标准的 IndexedDB 设置。我调用 initDb,保存结果,这为我提供了一种调用数据库的好方法。 var
我是一名优秀的程序员,十分优秀!