IndexedDB - 如何读取对象存储中的最大 ID
IndexedDB - How to read max id in object store
我正在开发一个从服务器读取数据的网络应用程序,为了节省成本,需要将数据存储在浏览器上,以便它可以“增量”从服务器读取数据而不是读取每次都使用它们,以减少网络使用。
我目前拥有的是:
- 将数组添加到现有对象存储的函数:
function IXDBaddItems(osName, items, callback) {
const tx = db.transaction([osName], "readwrite");
const obj = tx.objectStore(osName);
items.forEach(item => {
obj.put(item);
})
tx.oncomplete = (event) => {
callback();
}
};
- 在服务器上进行增量 ajax 调用的函数,参数为“lastId”,最后将结果存储在 objectStore
中
const getCorsiLastId = (lastId) => {
makeAjaxCall(urlCorsiVendite, "POST", {
ultimoId: lastId
})
.then(
(resp) => {
resp.forEach(d => {
d.id = +d.id;
d.id_course = +d.id_course;
d.id_user = +d.id_user;
d.insert_Date = new Date(d.insert_Date);
d.nome_corso = d.nome_corso;
d.year = +d.insert_Date.getFullYear();
d.month = +d.insert_Date.getMonth() + 1;
d.ref = +d.ref;
});
IXDBaddItems('corsiVendite', resp, () => console.log('db corsi update completed'));
},
(err) => console.log(err)
);
};
- “异步主体”:
let db;
(async () => {
let request = window.indexedDB.open('dbKpiMarketing', 1);
// onerror handler signifies that the database didn't open successfully
request.onerror = (e) => {
console.log(e);
};
// onsuccess handler signifies that the database opened successfully
request.onsuccess = async(e) => {
console.log('Database opened successfully');
// Store the opened database object in the db variable. This is used a lot below
db = request.result;
getCorsiLastId(0);
};
// Setup the database tables if this has not already been done
request.onupgradeneeded = (e) => {
// Grab a reference to the opened database
let db = e.target.result;
// Create an objectStore to store our data
let osCorsi = db.createObjectStore('corsiVendite', {
keyPath: 'id'
});
let osServizi = db.createObjectStore('serviziVendite', {
keyPath: 'id'
});
console.log('Database setup complete');
};
})();
现在我正在使用 lastId=0 调用 ajax 函数以恢复所有内容。
我需要让它充满活力。
通过控制台中的这两行代码,我得到了我要找的东西:最高存储 ID。
let c = db.transaction('corsiVendite').objectStore('corsiVendite').getAll()
let lastIdCorsi = Math.max(...c.result.map(d=>d.id));
我需要在调用 getCorsiLastId(LastIdCorsi)
之前使用这两行和 运行 它们,但是如果我尝试这样做,我会收到错误消息:Uncaught (in promise) DOMException: Failed to从 'IDBRequest' 读取 'result' 属性:请求尚未完成。
我知道交易需要一些时间,所以我不能立即使用结果。
我该如何解决这个问题?
我想我已经解决了...我实际上已经在 IXDBaddItems 函数中使用交易的 oncomplete 方法做了正确的事情。我添加了这些行:
let t = db.transaction('corsiVendite', 'readwrite');
let o = t.objectStore('corsiVendite');
let c = o.getAll();
t.oncomplete = (e) => {
LastId = Math.max(...c.result.map(d=>d.id));
};
我正在开发一个从服务器读取数据的网络应用程序,为了节省成本,需要将数据存储在浏览器上,以便它可以“增量”从服务器读取数据而不是读取每次都使用它们,以减少网络使用。
我目前拥有的是:
- 将数组添加到现有对象存储的函数:
function IXDBaddItems(osName, items, callback) {
const tx = db.transaction([osName], "readwrite");
const obj = tx.objectStore(osName);
items.forEach(item => {
obj.put(item);
})
tx.oncomplete = (event) => {
callback();
}
};
- 在服务器上进行增量 ajax 调用的函数,参数为“lastId”,最后将结果存储在 objectStore 中
const getCorsiLastId = (lastId) => {
makeAjaxCall(urlCorsiVendite, "POST", {
ultimoId: lastId
})
.then(
(resp) => {
resp.forEach(d => {
d.id = +d.id;
d.id_course = +d.id_course;
d.id_user = +d.id_user;
d.insert_Date = new Date(d.insert_Date);
d.nome_corso = d.nome_corso;
d.year = +d.insert_Date.getFullYear();
d.month = +d.insert_Date.getMonth() + 1;
d.ref = +d.ref;
});
IXDBaddItems('corsiVendite', resp, () => console.log('db corsi update completed'));
},
(err) => console.log(err)
);
};
- “异步主体”:
let db;
(async () => {
let request = window.indexedDB.open('dbKpiMarketing', 1);
// onerror handler signifies that the database didn't open successfully
request.onerror = (e) => {
console.log(e);
};
// onsuccess handler signifies that the database opened successfully
request.onsuccess = async(e) => {
console.log('Database opened successfully');
// Store the opened database object in the db variable. This is used a lot below
db = request.result;
getCorsiLastId(0);
};
// Setup the database tables if this has not already been done
request.onupgradeneeded = (e) => {
// Grab a reference to the opened database
let db = e.target.result;
// Create an objectStore to store our data
let osCorsi = db.createObjectStore('corsiVendite', {
keyPath: 'id'
});
let osServizi = db.createObjectStore('serviziVendite', {
keyPath: 'id'
});
console.log('Database setup complete');
};
})();
现在我正在使用 lastId=0 调用 ajax 函数以恢复所有内容。 我需要让它充满活力。 通过控制台中的这两行代码,我得到了我要找的东西:最高存储 ID。
let c = db.transaction('corsiVendite').objectStore('corsiVendite').getAll()
let lastIdCorsi = Math.max(...c.result.map(d=>d.id));
我需要在调用 getCorsiLastId(LastIdCorsi)
之前使用这两行和 运行 它们,但是如果我尝试这样做,我会收到错误消息:Uncaught (in promise) DOMException: Failed to从 'IDBRequest' 读取 'result' 属性:请求尚未完成。
我知道交易需要一些时间,所以我不能立即使用结果。
我该如何解决这个问题?
我想我已经解决了...我实际上已经在 IXDBaddItems 函数中使用交易的 oncomplete 方法做了正确的事情。我添加了这些行:
let t = db.transaction('corsiVendite', 'readwrite');
let o = t.objectStore('corsiVendite');
let c = o.getAll();
t.oncomplete = (e) => {
LastId = Math.max(...c.result.map(d=>d.id));
};