Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何获取objectstore.add()添加到IndexedDB的对象的(自动递增)id?_Javascript_Indexeddb - Fatal编程技术网

Javascript 如何获取objectstore.add()添加到IndexedDB的对象的(自动递增)id?

Javascript 如何获取objectstore.add()添加到IndexedDB的对象的(自动递增)id?,javascript,indexeddb,Javascript,Indexeddb,我正在开发一个WebExtension,并使用IndexedDB来存储对象。当我存储一个新对象时,它将不是唯一的。因此,我使用自动递增的id使其唯一。在第一次添加之后,我将做一些工作,修改/更新一些属性,因此必须更新数据库中的对象。但是要更新一个对象,我需要知道它的ID,到目前为止我还不知道 这是我向数据库添加对象的代码: const dbName=“MyDb”; 常数dbVersion=1; const storeName=“MyStore”; 函数addObject(obj){ const

我正在开发一个WebExtension,并使用IndexedDB来存储对象。当我存储一个新对象时,它将不是唯一的。因此,我使用自动递增的id使其唯一。在第一次添加之后,我将做一些工作,修改/更新一些属性,因此必须更新数据库中的对象。但是要更新一个对象,我需要知道它的ID,到目前为止我还不知道

这是我向数据库添加对象的代码:

const dbName=“MyDb”;
常数dbVersion=1;
const storeName=“MyStore”;
函数addObject(obj){
const request=window.indexedDB.open(dbName,dbVersion);
request.onupgradeneeded=事件=>{
const db=event.target.result;
const objectStore=db.createObjectStore(storeName,{keyPath:'id',autoIncrement:true});
}
request.onsuccess=事件=>{
const db=event.target.result;
const transaction=db.transaction(storeName,'readwrite');
const objectStore=transaction.objectStore(storeName);
objectStore.add(obj);
transaction.onerror=事件=>{
console.error('添加对象时出错:',event.target.error.message);
};
//如何获取/返回先前添加的对象的ID?
transaction.onsuccess=事件=>{
日志(event.target.result);
};
transaction.oncomplete=事件=>{
日志(event.target.result);
};
}
}
addObject({prop1:“foo”,prop2:“bar”,prop3:,prop4:”});
类似问题的答案-和-建议在成功添加后查询
event.target.result
,但在上述代码中返回
undefined
,尽管对象已成功插入


那么,有没有一种方法可以获取刚刚添加的对象的ID呢?

结果是,我听错了事件处理程序。您不必听事务的
onsuccess
/
oncomplete
,而必须听查询的
onsuccess

此外,我将所有内容都打包成一个
承诺
,以便能够在id可用时尽快获取它

这是一个工作示例:

const dbName=“MyDb”;
常数dbVersion=1;
const storeName=“MyStore”;
函数addObject(obj){
返回新承诺(函数(解析){
const request=window.indexedDB.open(dbName,dbVersion);
request.onupgradeneeded=事件=>{
const db=event.target.result;
const objectStore=db.createObjectStore(storeName,{keyPath:'id',autoIncrement:true});
};
request.onsuccess=事件=>{
const db=event.target.result;
const transaction=db.transaction(storeName,'readwrite');
const objectStore=transaction.objectStore(storeName);
const query=objectStore.add(obj);
transaction.onerror=事件=>{
console.error('添加对象时出错:',event.target.error.message);
};
query.onsuccess=事件=>{
返回解析(event.target.result);//或:返回解析(query.result);
};
};
});
}
let id=await addObject({prop1:foo),prop2:bar,prop3:,prop4:});

结果是,我听错了事件处理程序。您不必听事务的
onsuccess
/
oncomplete
,而必须听查询的
onsuccess

此外,我将所有内容都打包成一个
承诺
,以便能够在id可用时尽快获取它

这是一个工作示例:

const dbName=“MyDb”;
常数dbVersion=1;
const storeName=“MyStore”;
函数addObject(obj){
返回新承诺(函数(解析){
const request=window.indexedDB.open(dbName,dbVersion);
request.onupgradeneeded=事件=>{
const db=event.target.result;
const objectStore=db.createObjectStore(storeName,{keyPath:'id',autoIncrement:true});
};
request.onsuccess=事件=>{
const db=event.target.result;
const transaction=db.transaction(storeName,'readwrite');
const objectStore=transaction.objectStore(storeName);
const query=objectStore.add(obj);
transaction.onerror=事件=>{
console.error('添加对象时出错:',event.target.error.message);
};
query.onsuccess=事件=>{
返回解析(event.target.result);//或:返回解析(query.result);
};
};
});
}
let id=await addObject({prop1:foo),prop2:bar,prop3:,prop4:});

与请求相关的成功事件,而不是与事务相关的成功事件。这是有区别的。如果更改
console.log(event.target.result)会怎么样
控制台日志(事件)?这些事件的内幕是什么?@Josh Thx,就是这样!与请求(而非事务)相关的成功事件。这是有区别的。如果更改
console.log(event.target.result)会怎么样
控制台日志(事件)?这些事件的内幕是什么?@Josh Thx,就是这样!