- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个 SPA 应用程序,它将对 IndexedDB
进行多次读取/写入。
打开数据库是一个带有回调的异步操作:
var db;
var request = window.indexedDB.open("MyDB", 2);
request.onupgradeneeded = function(event) {
// Upgrade to latest version...
}
request.onerror = function(event) {
// Uh oh...
}
request.onsuccess = function(event) {
// DB open, now do something
db = event.target.result;
};
我可以通过两种方式使用这个 db
实例:
db
实例?db.close()
并在下一个操作中打开一个新的?这两种模式都有缺陷吗?保持 indexedDB 打开有任何风险/问题吗?每个 open
操作是否有开销/延迟(超过可能的升级)?
最佳答案
我发现每次操作打开一个连接并不会显着降低性能。我已经运行本地 Chrome 扩展程序一年多了,它涉及大量的 indexedDB 操作,并且分析了它的性能数百次,并且从未见过打开连接成为瓶颈。瓶颈出现在做一些事情,比如没有正确使用索引或存储大 blob。
基本上,不要根据性能做出决定。就连接而言,这确实不是问题。
问题实际上是您的代码的人体工程学,您与 API 的斗争程度,以及当您查看代码时感觉代码的直观程度,您认为代码的稳定性如何,新人对它的欢迎程度(一个月后你自己的,或其他人)。这在处理间接处理应用程序模态的阻塞问题时非常值得注意。
我个人的看法是,如果您习惯于编写异步 Javascript,请使用您喜欢的任何方法。如果您在使用异步代码时遇到困难,选择始终打开连接往往可以避免任何问题。我绝不会向刚接触异步代码的人推荐使用单个全局页面生命周期变量。您还将在页面的生命周期内将变量留在那里。另一方面,如果您发现异步微不足道,并且发现全局 db 变量更适合,请务必使用它。
编辑 - 根据您的评论,我想我会分享一些我个人偏好的伪代码:
function connect(name, version) {
return new Promise((resolve, reject) => {
const request = indexedDB.open(name, version);
request.onupgradeneeded = onupgradeneeded;
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
request.onblocked = () => console.warn('pending till unblocked');
});
}
async foo(bar) {
let conn;
try {
conn = await connect(DBNAME, DBVERSION);
await storeBar(conn, bar);
} finally {
if(conn)
conn.close();
}
}
function storeBar(conn, bar) {
return new Promise((resolve, reject) => {
const tx = conn.transaction('store');
const store = tx.objectStore('store');
const request = store.put(bar);
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
}
使用 async/await,在您的操作函数中添加额外的 conn = await connect()
行不会有太大的摩擦。
关于javascript - 我应该每次打开一个 IDBDatabase 还是保持一个实例打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40593260/
我有一个 SPA 应用程序,它将对 IndexedDB 进行多次读取/写入。 打开数据库是一个带有回调的异步操作: var db; var request = window.indexedDB.ope
我一直在关注页面Using IndexedDB . 加载页面时,我创建/加载数据库。 window.App = window.App || {}; App.db = window.indexedDB.
为什么会出现错误? 我的代码: var idb = window.indexedDB || // Use the standard DB API window.mozIn
我正在使用最新的谷歌浏览器..我正在尝试实现 HTML5 indexedDB 示例。 AIM 是在页面加载数据并在其中存储数据时创建数据库。如果有人有的话,请发布任何示例工作示例。我尝试了这段代码,但
我在使用 indexeddb 时遇到问题 - 我正在使用此方法打开和设置数据库 DBService.prototype.open = function (dbName, entity, cb) {
有人可以告诉我我哪里出了问题吗? window.indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedD
这是我第一次使用 indexDB,我已经创建了一个数据库,现在正在尝试向其中添加内容。但我收到以下错误。 Uncaught NotFoundError: Failed to execute 'tran
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
以下代码: request=window.webkitIndexedDB.open('tileStore'); 产生错误请求:异常 11。打开适用于其他数据库。此外, request=window.w
我的对象结构是这样的: var test={ "id":"A", "ChanName":"Discovery", "LCN":10 };
代码如下: var transaction = db.transaction(["main"], IDBTransaction.READ_WRITE); var store = transaction
我在使用 IndexedDB 的应用程序上收到此警告。 “IDBDatabase.transaction 中不推荐使用数字事务模式。使用“readonly”或“readwrite”” 当我第一次编写应
代码如下: var transaction = db.transaction(["main"], IDBTransaction.READ_WRITE); var store = transaction
我对 IndexedDB 概念非常陌生。我正在尝试在 IndexedDB 中存储电影列表并检索它。但由于某种原因,当我尝试检索它时,chrome 浏览器中出现 DOM IDBDatabase Exce
我尝试使用 Indexed DB API 进行一些测试。 我的代码如下: var db = null; const dbName = "contactsD
自 2020 年 8 月以来我一直有问题,但我仍然不知道如何重现, 我正在使用 dfahlander/Dexie.js使用浏览器索引数据库。 这是我如何使用 dexie 的示例:- import db
我在创建 objectStore 时已成功添加以下内容: { name: "John Doe", age: 21 } 我使用了以下选项: { keyPath: "id", autoIncrement:
我必须承认我是 indexedDB 的新手 我写了一段indexedDB的简单代码,如下: function go() { var req = window.indexedDB.open("Up
@Josh 已经回答了一个关于填充 IndexedDB ObjectStores 时的错误消息的类似问题: Failed to execute 'transaction' on 'IDBDatabas
我是一名优秀的程序员,十分优秀!