gpt4 book ai didi

javascript - 我应该每次打开一个 IDBDatabase 还是保持一个实例打开?

转载 作者:数据小太阳 更新时间:2023-10-29 06:05:16 25 4
gpt4 key购买 nike

我有一个 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 实例:

  1. 在页面/SPA 的生命周期内保留一个 db 实例?
  2. 在当前操作完成后调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com