我是学习Web开发和IndexedDB的新手。我已经成功地使用Visual Studio创建了一个测试Blazor WebAssembly应用程序并结合了IndexedDB。特别是,我已经成功创建了数据库,在商店中填充了数据,然后检索了该数据。到目前为止,一切都很好。作为其中的一部分,我能够自动以JavaScript代码打开数据库,一旦打开就读取数据存储,然后使用JSON将数据传递给Blazor c#方法,这样我就可以通过现有的c#代码对其进行处理。我已经能够通过在数据库上使用“ await”来使后者工作,从而确保在后续代码尝试检索数据之前将其打开。花了相当长的时间将所有内容拼凑在一起,但它确实有效。但是,当我更改数据库版本,从而触发onupgradeneeded事件时,它不起作用。在这种情况下,await似乎不起作用,因为尝试读取数据的js在Open完成之前正在执行。因此,我希望了解自己在做错或未做的事情。
谢谢。史蒂夫
async function Database_Open()
{
var dbReq = await indexedDB.open(databaseName, 1);
dbReq.onupgradeneeded = function (event)
{
meDatabase = (event.target as any).result;
let bbDetailStore = meDatabase.createObjectStore(bbDetailStoreName, { autoIncrement: true });
console.log(bbDetailStore.keyPath);
bbDetailStore.createIndex("by_VblName", "vblName", { unique: false });
bbDetailStore.createIndex("by_Year", "year", { unique: false });
}
dbReq.onsuccess = function (event) { meDatabase = (<IDBOpenDBRequest>event.target).result; let x = 1; }
dbReq.onerror = function (event) { alert('error opening database ' + (event.target as any).errorCode); }
}
[使用传统的Promise
语法可能比使用async / await更好。它们对于“承诺”某些内容不是很有用。
function Database_Open()
{
return new Promise(function(resolve, reject) {
var dbReq = indexedDB.open(databaseName, 1);
dbReq.onupgradeneeded = function (event)
{
meDatabase = (event.target as any).result;
let bbDetailStore = meDatabase.createObjectStore(bbDetailStoreName, { autoIncrement: true });
console.log(bbDetailStore.keyPath);
bbDetailStore.createIndex("by_VblName", "vblName", { unique: false });
bbDetailStore.createIndex("by_Year", "year", { unique: false });
resolve(dbReq);
}
dbReq.onsuccess = function (event) {
meDatabase = (<IDBOpenDBRequest>event.target).result;
let x = 1;
resolve(dbReq);
}
dbReq.onerror = function (event) {
reject('error opening database ' + (event.target as any).errorCode);
}
});
}