如何获取由objectstore.add添加到IndexedDB的对象的自动递增ID?

问题描述

我正在使用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: ""});

类似问题的答案-herehere-建议添加成​​功后再查询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: ""});

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...