1

所以我第一次使用dexie.js和 IndexedDB 构建了一个支持离线的小应用程序。如果本地机器上已经存在一个数据库,我想打开并使用那个现有的数据库——>所以我使用Dexie.exists(). 借用 Dexie.js wiki 中的示例代码,我将以下内容添加到我的应用程序中(而不是登录到控制台,我正在使用警报进行测试)

Dexie.exists("myDatabase").then(function(exists) {
  if (exists)
    alert("Database exists");
  else
    alert("Database doesnt exist");
}).catch(function (error) {
    alert("Oops, an error occurred when trying to check database existence");
});

但是,此代码(直接取自示例)对我不起作用。如果数据库不存在,代码会正确返回警报“数据库不存在”。但是,在测试时,我之前创建了一个数据库,然后使用db.delete(). 现在,当我测试我删除的数据库是否存在时,没有返回任何内容。它应该返回“数据库不存在”,或者至少是一个错误,但它没有。我发现如果我将代码更新为以下内容:

Dexie.exists("myDatabase").then(function(exists) {
  if (exists)
    alert("Database exists");
  else
    alert("Database doesnt exist");
}).catch(
    alert("Oops, an error occurred when trying to check database existence")
);

弹出警报“糟糕,尝试检查数据库是否存在时发生错误”。不幸的是,我不知道错误是什么,也不知道为什么该catch()语句仅在我删除匿名函数时才有效。

查看 的代码Dexie.exists(),它会测试它是否可以open()访问有问题的数据库。据我所知,尝试打开我删除的数据库似乎以与我失败的方式相似的方式Dexie.exists()失败。似乎我之前尝试删除数据库时搞砸了一些事情,现在 Dexie 无法正常工作。由于 Dexie 很好地结合了 Promise,我看不到任何我假设的错误正在生成。

我已经花了大约 8 个小时试图解决这个问题,但无济于事。如果有人有使用 Dexie.js 的经验并且可以为我指明正确的方向,我将非常感激。或者,如果有人对 IndexedDB 有经验,也许我可以通过“重置”本地 IndexedDB 来解决问题(如果我在测试时确实搞砸了)。不过,我还没有找到一种方法来做到这一点(据我所知,直接使用 IndexedDB 很痛苦)。

非常感谢您对此的任何帮助!

4

1 回答 1

1

所以你.catch(alert())返回的是假阴性......即使承诺解决了它也会显示警报......从你所说的看来,承诺没有解决,因此仍处于待处理状态。清除浏览器的缓存会有所帮助。像这样

于 2016-04-10T11:53:00.823 回答