问题描述
我正在使用WebExtension,并使用IndexedDB存储对象。当我存储新对象时,它不会是唯一的。因此,我使用自动递增的ID使其唯一。第一次添加后,我将做一些工作,修改/更新一些属性,因此必须更新数据库中的对象。但是要更新对象,我需要知道它的ID,到目前为止我还不知道。
这是我向数据库添加对象的代码:
const dbName = "MyDb";
const dbVersion = 1;
const storeName = "MyStore";
function addObject(obj) {
const request = window.indexedDB.open(dbName,dbVersion);
request.onupgradeneeded = event => {
const db = event.target.result;
const objectStore = db.createObjectStore(storeName,{ keyPath: 'id',autoIncrement: true });
}
request.onsuccess = event => {
const db = event.target.result;
const transaction = db.transaction(storeName,'readwrite');
const objectStore = transaction.objectStore(storeName);
objectStore.add(obj);
transaction.onerror = event => {
console.error('Error while adding an object: ',event.target.error.message);
};
// How do I get/return the ID of the previously added object?
transaction.onsuccess = event => {
console.log(event.target.result);
};
transaction.oncomplete = event => {
console.log(event.target.result);
};
}
}
addObject({prop1: "foo",prop2: "bar",prop3: "",prop4: ""});
类似问题的答案-here和here-建议添加成功后再查询event.target.result
,但在上面的代码中它返回undefined
,尽管该对象已成功插入。
那么,有没有办法获取刚刚添加的对象的ID?
解决方法
原来,我在听错误的事件处理程序。不必监听事务的onsuccess
/ oncomplete
,而必须监听查询的onsuccess
。
此外,我将所有内容包装到Promise
中,以便能够在ID可用时立即获取。
这是工作示例:
const dbName = "MyDb";
const dbVersion = 1;
const storeName = "MyStore";
function addObject(obj) {
return new Promise(function(resolve) {
const request = window.indexedDB.open(dbName,dbVersion);
request.onupgradeneeded = event => {
const db = event.target.result;
const objectStore = db.createObjectStore(storeName,{ keyPath: 'id',autoIncrement: true });
};
request.onsuccess = event => {
const db = event.target.result;
const transaction = db.transaction(storeName,'readwrite');
const objectStore = transaction.objectStore(storeName);
const query = objectStore.add(obj);
transaction.onerror = event => {
console.error('Error while adding an object: ',event.target.error.message);
};
query.onsuccess = event => {
return resolve(event.target.result); // OR: return resolve(query.result);
};
};
});
}
let id = await addObject({prop1: "foo",prop2: "bar",prop3: "",prop4: ""});