Onupgradeneed火灾时如何等待IndexedDB打开

问题描述 投票:0回答:1

我是学习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); }
}
javascript c# async-await indexeddb
1个回答
0
投票

[使用传统的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);
      }
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.