gpt4 book ai didi

javascript - 在回调中恢复 IDBTransaction 会抛出 TransactionInactiveError

转载 作者:行者123 更新时间:2023-12-03 06:40:52 25 4
gpt4 key购买 nike

我正在开发一个广泛使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com